PIL auf Windows und Rasbian

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hallo Forum,
ich habe ein Programm geschrieben, welches Datenströme auswertet und entsprechend diesem ein Image ausgeben soll.
Auf meinem Windowssystem (Win 7) läuft alles prima, nur leider nicht auf meinem Raspberry Pi. Die Datenströme erreichen den Codeschnipsel, aber das das Image wird leider nur auf Windows angezeigt. Kann mir da eventuell jemand weiterhelfen?

mit bestem Gruß
euer Rudel Gurken ak Georg

Code: Alles auswählen

from PIL import Image
#import serial
#ser = serial.Serial('/dev/ttyUSB0', 9600)
red = Image.open("red.jpg");
part_red = red.crop((0,0,165,165))
green = Image.open("green.png")
part_green = green.crop((0,0,165,165))
im = Image.open("deutschland_beschnitten.png")
input = "010101101101"
input_new = ""
while True:
    #input = serial.readline()
    if input_new != input:
        input_new = input
        if input == "011111111111":
            im.show()
        else:
            #Bildabschnitt 1:
            if input[0] == "0":
                im.paste(part_green,(0,0,165,165))
                print "OK"
            else:
                im.paste(part_red,(0,0,165,165))
                print "nicht ok"
            #Bildabschnitt 2:
            if input[1] == "1":
                im.paste(part_green,(165,0,330,165))
                print "OK"
            else:
                im.paste(part_red,(165,0,330,165))
                print "nicht ok"
            #Bildabschnitt 3:
            if input[2] == "1":
                im.paste(part_green,(330,0,495,165))
                print "OK"
            else:
                im.paste(part_red,(330,0,495,165))
                print "nicht ok"
            #Bildabschnitt 4:
            if input[3] == "1":
                im.paste(part_green,(0,165,165,330))
                print "OK"
            else:
                im.paste(part_red,(0,165,165,330))
                print "nicht ok"
            #Bildabschnitt 5:
            if input[4] == "1":
                im.paste(part_green,(165,165,330,330))
                print "OK"
            else:
                im.paste(part_red,(165,165,330,330))
                print "nicht ok"
            #Bildabschnitt 6:
            if input[5] == "1":
                im.paste(part_green,(330,165,495,330))
                print "OK"
            else:
                im.paste(part_red,(330,165,495,330))
                print "nicht ok"
            #Bildabschnitt 7:
            if input[6] == "1":
                im.paste(part_green,(0,330,165,495))
                print "OK"
            else:
                im.paste(part_red,(0,330,165,495))
                print "nicht ok"
            #Bildabschnitt 8:
            if input[7] == "1":
                im.paste(part_green,(165,330,330,495))
                print "OK"
            else:
                im.paste(part_red,(165,330,330,495))
                print "nicht ok"
            #Bildabschnitt 9:
            if input[8] == "1":
                print "OK"
                im.paste(part_green,(330,330,495,495))
            else:
                im.paste(part_red,(330,330,495,495))
                print "nicht ok"
            #Bildabschnitt 10:
            if input[9] == "1":
                im.paste(part_green,(0,495,165,660))
                print "OK"
            else:
                im.paste(part_red,(0,495,165,660))
                print "nicht ok"
            #Bildabschnitt 11:
            if input[10] == "1":
                im.paste(part_green,(165,495,330,660))
                print "OK"
            else:
                im.paste(part_red,(165,495,330,660))
                print "nicht ok"
            #Bildabschnitt 12:
            if input[11] == "1":
                print "OK"
                im.paste(part_green,(330,495,495,660))
            else:
                im.paste(part_red,(330,495,495,660))
                print "nicht ok"
        im.show()
Zuletzt geändert von Anonymous am Freitag 22. August 2014, 11:58, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@RudelGurken: Die Dokumentation zu Image.show() sagt das unter Unix das Bild in eine temporäre Datei gespeichert und mit dem Bildbetrachter ``xv`` angezeigt wird. Wobei bei mir auf dem Laptop ``display`` aus dem ImageMagick-Paket verwendet wird. Ich würde letzteres einfach mal installieren und schauen ob es dann angezeigt wird.

Der Code ist ja sehr Wiederholungsreich. Das würde man eigentlich mit einer Schleife und entsprechenden Datenstrukturen lösen, statt da so viele gleichartige Quelltextabschnitte hin zu schreiben.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hi,
danke für deine Antwort mit dem ImageMagick funktioniert es. (apt-get install imagemagick).
Nur habe ich jetzt leider das Problem, das immer wieder ein neues Fenster aufgemacht wird, aber das kriege ich wahrscheinlich auch noch hin.
mit bestem Gruß und ein schönes Wochenende wünschend
Georg
BlackJack

So in der Art könnte das ohne diese furchtbar vielen Quelltextwiederholungen und ”magischen” Zahlen aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
from contextlib import closing

from PIL import Image
from serial import Serial


def filter_runs(items):
    previous_item = object()
    for item in items:
        if item != previous_item:
            yield item
            previous_item = item


def create_image(lines):
    part_size = 165
    parts_per_column = 3
    red_image, green_image = (
        Image.open(filename).crop((0, 0, part_size, part_size))
        for filename in ['red.jpg', 'green.jpg']
    )
    map_image = Image.open('deutschland_beschnitten.png')
    for line in lines:
        line = line.strip()
        if line == '011111111111':
            break
        for i, bit_value in enumerate(line):
            y, x = divmod(i, parts_per_column)
            map_image.paste(
                green_image if bit_value == '1' else red_image,
                (x * part_size, y * part_size)
            )
    return map_image


def main():
    with closing(Serial('/dev/ttyUSB0', 9600)) as lines:
        map_image = create_image(filter_runs(lines))
    map_image.show()


if __name__ == '__main__':
    main()
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hi ,
vielen Dank für diesen Quelltext. Werde ich gleich mal ausprobieren. Ich habe gerade erst mit Python angefangen(bis auf zwei kleine skripts brauchte ich es noch nie wirklich) und braucht eben fix ein Ergebnis. Aber dein Quelltext zeigt mir, was alles mit Python geht-besten Dank.
Antworten