Seite 1 von 1

PIL auf Windows und Rasbian

Verfasst: Freitag 22. August 2014, 10:16
von RudelGurken
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()

Re: PIL auf Windows und Rasbian

Verfasst: Freitag 22. August 2014, 12:11
von 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.

Re: PIL auf Windows und Rasbian

Verfasst: Freitag 22. August 2014, 12:43
von RudelGurken
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

Re: PIL auf Windows und Rasbian

Verfasst: Freitag 22. August 2014, 14:03
von 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()

Re: PIL auf Windows und Rasbian

Verfasst: Montag 25. August 2014, 06:15
von RudelGurken
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.