Statische meterafbeelding met Pillow

Er zijn meerdere manieren om een waarde weer te geven. Een halve cirkel in de vorm van een snelheidsmeter ziet er vaak erg sexy uit. Ik heb hieronder een script geplaatst op basis van de PIL waarin een percentage fraai weergegeven wordt. Weliswaar is het een statische weergave, maar erg goed toepasbaar voor bijvoorbeeld het weergeven op websites.  

In deze tutorial maak je een meter waarbij de naald op een percentage waarde staat die ingegeven is. Dit kan natuurlijk ook een ingelezen waarde van een sensor zijn.

Wat is Pillow?
De Python Imaging Library voegt beeldverwerkingsmogelijkheden toe aan jouw Python-interpreter. Deze bibliotheek biedt uitgebreide ondersteuning voor bestandsindelingen, een efficiënte interne weergave en redelijk krachtige beeldverwerkingsmogelijkheden.

Kijk voor meer informatie op https://pypi.org/project/Pillow/

Hoe dan?
Het principe is erg eenvoudig. Je maakt een afbeelding van een meter in de vorm van halve cirkel en je zet er een afbeelding van een naald overheen. De laatste moet een transparante PNG-afbeelding zijn. Belangrijk is dat beide afbeeldingen exact even groot zijn.

De hoek van de naaldafbeelding wordt ingegeven en door de software over de afbeelding van de meter heen gelegd.

In het download bestand heb ik het .psd-bestand meegeleverd zodat je de meter zelf kan bouwen / aanpassen. Heb je een Windows machine, dan zal hiervoorstandaard Autodesk SketchBook openen.

Script uitgelegd
Eerst laden we de PIL bibliotheek en de specifieke module:

import PIL
from PIL import Image

Vervolgens maken we de variabelen aan en geven ze een waarde:

percentage = 25
nieuwe_bestandsnaam = 'nieuwe_meter.png'

We hebben de locatie nodig van de onderkant van de naald ten opzichte van de linkerbovenhoek van de afbeelding. Deze geven we in punten aan:

x = 825
y = 825
lok = (x, y)

Vervolgens moeten we rotatie bepalen die de naald(afbeelding) moet maken ten opzichte van de meterafbeelding. De rotatie is 180 graden omdat de meter een halve cirkel is. Factor in de naaldgrafiek wijzend naar 50 is dan 90 graden.

percentage = percentage / 100
rotatie = 180 * percentage
rotatie = 90 – rotatie

De afbeelding ‘naald.png’ wordt als variabele naald in PIL geopend en vervolgens wordt de afbeelding gedraaid op het draaipunt (lok) dat opgegeven is. De variabele naald bevat nu een geroteerde afbeelding.

naald = Image.open('naald.png')
naald = naald.rotate(rotatie, resample=PIL.Image.BICUBIC, center=lok)

De afbeelding ‘meter.png’ wordt in PIL geopend. Vervolgens wordt de variabele naald over de meter afbeelding heen gelegd, als het ware wordt de naald op de meter ‘geplakt’.

meter = Image.open('meter.png')
meter.paste(naald, mask=naald)

De nieuwe afbeelding wordt opgeslagen onder de opgegeven naam.

meter.save(nieuwe_bestandsnaam)

De afbeelding wordt getoond met het standaard programma van het besturingssysteem.

meter.show()

ImportError: No module named PIL
Mocht de Raspberry Pi deze melding geven, voer dan in de terminal de volgende installatie opdracht in:

pip install Pillow

Het Python script
Open een editor zoals nano en zet onderstaande tekst erin.

nano meter.py

Start het script in de desktop van de Raspberry Pi op met:

python meter.py

Het script

# Statische percentage meter - door Picademie.nl #

import PIL
from PIL import Image

percentage = 25  # Voer hier het percentage in 
nieuwe_bestandsnaam = 'nieuwe_meter.png'

# X- en Y-coördinaten (van het midden) van de onderkant van de naald
# vanaf de linkerbovenhoek van de afbeelding
x = 825
y = 825
lok = (x, y)

percentage = percentage / 100
rotatie = 180 * percentage    # 180 graden omdat de meter een halve cirkel is
rotatie = 90 - rotatie       # Factor in de naaldgrafiek wijzend naar 50 (90 graden)

naald = Image.open('naald.png')
naald = naald.rotate(rotatie, resample=PIL.Image.BICUBIC, center=lok)  # Draai naald

meter = Image.open('meter.png')
meter.paste(naald, mask=naald)  # Plak de naald op de meter
meter.save(nieuwe_bestandsnaam)
meter.show()

Have A Nice Day!

Geef als eerste een reactie

Laat een reactie achter

Het e-mailadres wordt niet gepubliceerd.


*