Forum: PC-Programmierung Bild auf TFT positionieren mit Raspberry und Python


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich habe einen Raspberry  an dem ein 2,8" TFT über SPI angeschlossen 
ist.
Ich gebe eine Grafik mit folgendem Code aus (Ausschnitt, in Python):
1
from PIL import Image, ImageDraw, ImageFont
2
....
3
image = Image.new("RGB", (width, height))
4
draw.rectangle((0, 0, width, height), outline=0, fill=(0, 0, 0))
5
disp.image(image)
6
image = Image.open("test.jpg")
7
disp.image(image)

Das funktioniert einwandfrei. Zunächst wird das Display ein mal schwarz 
gemacht, dann die Grafik geladen und Angezeigt.

Nun mein Problem: Die Grafik wird immer links oben angezeigt (Grafik hat 
100x100 Pixel, Display hat 240x320 Pixel).
Wie kann ich die Position der Grafik bestimmen. Im nächsten Schritt 
sollen unterschiedliche Grafiken nebeneinander am unteren Displayrand 
angezeigt werden. Hierfür müsste ich die exakte Position angeben können.

Google hat "draw.bitmap" ausgespuckt.
Ich habe es folgendermaßen versucht:
1
draw.bitmap((150, 150), Image.open('test.bmp'), fill=None)

Egal was ich für "fill" eingebe, es kommt entweder Syntaxfehler oder 
"bad transparency mask". Ich habe schon RGB-Werte, RGBA-Werte, die 
Zahlen 0, 1 und 255 sowie den Wert "none" versucht, immer das gleiche. 
Wobei diese Sachen bei Beispielen die ich über Google gefunden habe 
angezeigt werden.

Wenn ich Text ausgeben will funktioniert es mit folgender Beispielzeile 
ohne Probleme. Der Text wird korrekt ausgegeben und positioniert.
1
draw.text((140, 180), text, font=font_groß, fill=(255, 255, 0))

Was mache ich falsch, oder gibt es eine bessere Methode?
Ziel ist es im unteren Displaybereich 3 Grafiken nebeneinander 
anzuzeigen. Diese Grafiken wechseln je nach Messwerte, müssen also 
variabel sein. Darüber ist ein großer Bereich vom Display für Messwerte 
vorgesehen (Textzeilen unterschiedlicher Größe).
Das mit dem Text funktioniert bereits. Ich muss nur noch die Grafiken 
einbinden können.

von Imonbln (Gast)


Lesenswert?

R. F. schrieb:
> Nun mein Problem: Die Grafik wird immer links oben angezeigt (Grafik hat
> 100x100 Pixel, Display hat 240x320 Pixel).
> Wie kann ich die Position der Grafik bestimmen. Im nächsten Schritt
> sollen unterschiedliche Grafiken nebeneinander am unteren Displayrand
> angezeigt werden. Hierfür müsste ich die exakte Position angeben können.

Ich bin kein PIL Experte aber, wie wäre es, wenn du erstmal versuchst 
dein 100×100 Bild zentriert anzeigen zu lassen. Google hat da folgenden 
Code ausgespuckt. Mit dem überlasse ich dir, das ganze dann deinen Fall 
zu anzupassen.
1
with Image.open('test.jpg') as im:
2
    background = Image.new("RGB", (width, height))
3
    bg_w, bg_h = background.size
4
    img_w, img_h = im.size
5
6
    offset = ((bg_w - img_w) // 2, (bg_h - img_h) // 2)
7
    background.paste(im, offset)
8
    background.show()

von R. F. (inet_surfer88)


Lesenswert?

Vielen Dank. Der Hinweis war die Lösung.
Letztendlich reicht diese Zeile:
1
image.paste(Image.open('test.jpg'),(x,y))

x und y sind natürlich durch den gewünschten Offset in Pixel zu 
ersetzen. Das wars.
Jetzt kann es bei meinem Projekt weiter gehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.