Wie kompiliert man MicroPython vom Quellcode selbst?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Da man ja weiß, dass es ein Bitmap ist, kann man das noch deutlich effizienter Codieren:

Code: Alles auswählen

bytes([13,4,5,2,2,2,8,2,6,3,9,2,4,2,2,2,5,4,23,0])
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ja, so ganz grob mit:

Code: Alles auswählen

In [267]: [count // 2 for value, count in  more_itertools.run_length.encode(image)]
Out[267]: [13, 4, 5, 2, 2, 2, 8, 2, 6, 3, 9, 2, 4, 2, 2, 2, 5, 4, 23]
Allerdings muss man da dann noch „runs“ berücksichtigen, die länger als 255 oder 256 Pixel sind, und mit welcher Farbe das Bild beginnt, und 0 als Endkennzeichen könnte dann problematisch werden.

Edit: Und wenn man es wirklich als Bitmap sieht, dann sind das 100 Bits, also 13 Bytes wenn man es als Bitstrom packt, und 20 Bytes wenn man jede 10 Pixel Zeile in zwei Bytes verpackt und jeweils 6 Bits pro Zeile ”verschwendet”. Beides kleiner als die effiziente Lauflängenkodierung.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Vielen Dank für eure Antworten.
__deets__ hat geschrieben: Freitag 9. September 2022, 11:32 da platzt dem armen Dennis der Kopf 🫣
Im laufe dieses Threads ist er mir gefühlt schon öfters geplatzt. Aber jeder Schritt dem man seinem Ziel näher kommt fühlt sich auch wieder gut an. (Trotz den ganzen Umwegen und Holzwegen über die ich immer gehe)

Wenn alles nach Plan läuft beginne ich im Laufe des Abends damit mal ein Bild als Bytearray darzustellen. Alles weitere was hier geschrieben wird, werde ich dann hoffentlich Schritt für Schritt auch nachvollziehen können. Also bitte nicht wundern, dass ich jetzt nicht auf jeden Beitrag eingehe, das kommt(hoffentlich) noch.

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Abend,

bin ich mit tobytes von PIL.Image an der richtigen Stelle?

Code: Alles auswählen

from pathlib import Path

IMAGE_PATH = Path('/home/dennis/Bilder')


def main():
    for image in IMAGE_PATH.iterdir():
        with Image.open(image, mode='r', formats=('BMP',)) as image_to_bytes:
            print(image_to_bytes.tobytes())


if __name__ == '__main__':
    main()
Das Bild ist 10x10px groß, enthält eine schwarze Eins auf weißem Hintergrund und ist im bmp-Format gespeichert. Ich bekomme jetzt aber 400 Bytes, also doppelt so viele wie ich brauche.
'tobytes' kann ja verschiedene Encoder annehmen, brauche ich da einen anderen?

Ich gehe davon aus, das wenn ich so ein Bild auslese, dass ich dann ein Bytearray bekomme das doppelt so groß ist wie die Pixelabmessungen, wegen der Farbe. Ist das richtig oder kann das auch anders sein und ich muss expliziet das RGB565 noch irgendwo angeben?

Weil aktuell habe ich das format RGBA, wenn ich mir folgendes ausgeben lasse:

Code: Alles auswählen

from pathlib import Path

IMAGE_PATH = Path('/home/dennis/Bilder')


def main():
    for image in IMAGE_PATH.iterdir():
        with Image.open(image, mode='r', formats=('BMP',)) as image_to_bytes:
            print(image_to_bytes)


if __name__ == '__main__':
    main()
dann bekomme ich:

Code: Alles auswählen

<PIL.BmpImagePlugin.BmpImageFile image mode=RGBA size=10x10 at 0x7F1CCC6884F0>
Das würde das zu große Array erklären?

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Abend,

ich habe jetzt einen schwarzen Kreis auf einem weißen Hintergrund, 50x50px und in 'bmp'-Format gespeichert. Dann kann ich PIL verwenden oder die Datei "normal" öffnen:

Code: Alles auswählen

from pathlib import Path
from PIL import BmpImagePlugin

IMAGE_PATH = Path('/home/dennis/Bilder')


def main():
    for image in IMAGE_PATH.iterdir():
        with BmpImagePlugin.BmpImageFile(image) as image_to_bytes:
            print(image_to_bytes.tobytes())
            print(image_to_bytes)


if __name__ == '__main__':
    main()
ergibt:

Code: Alles auswählen

b"BM\xf6\x12\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00(\x00\x00\x00(\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\xc0\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\xc7\xc7\xc7~~~FFF\x1f\x1f\x1f\x08\x08\x08\x00\x00\x00\x08\x08\x08\x1f\x1f\x1fFFF~~~\xc7\xc7\xc7\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xfa\x97\x97\x97%%%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%%%\x97\x97\x97\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc7\xc7\xc7)))\x00\x00\x00\x00\x00\x00\x1c\x1c\x1cnnn\xb0\xb0\xb0\xdb\xdb\xdb\xf7\xf7\xf7\xff\xff\xff\xf7\xf7\xf7\xdb\xdb\xdb\xb0\xb0\xb0nnn\x1c\x1c\x1c\x00\x00\x00\x00\x00\x00)))\xc7\xc7\xc7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x05\x05\x05\x00\x00\x00'''\xaa\xaa\xaa\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc\xfc\xaa\xaa\xaa'''\x00\x00\x00\x05\x05\x05\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x01\x01\x01\x00\x00\x00rrr\xf8\xf8\xf8\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8rrr\x00\x00\x00\x01\x01\x01\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\xc9\xc9\x05\x05\x05\x01\x01\x01\x94\x94\x94\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x94\x94\x94\x01\x01\x01\x05\x05\x05\xc9\xc9\xc9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\xfd\xfd000\x00\x00\x00qqq\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffqqq\x00\x00\x00000\xfd\xfd\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb3\xb3\xb3\x00\x00\x00\x1e\x1e\x1e\xf6\xf6\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf6\xf6\xf6\x1e\x1e\x1e\x00\x00\x00\xb3\xb3\xb3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffZZZ\x00\x00\x00\x89\x89\x89\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x89\x89\x89\x00\x00\x00ZZZ\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff!!!\x00\x00\x00\xd4\xd4\xd4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd4\xd4\xd4\x00\x00\x00!!!\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x05\x05\x00\x00\x00\xf9\xf9\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\xf9\xf9\x00\x00\x00\x00\x00\x00\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x05\x05\x00\x00\x00\xf9\xf9\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\xf9\xf9\x00\x00\x00\x00\x00\x00\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff!!!\x00\x00\x00\xd4\xd4\xd4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd4\xd4\xd4\x00\x00\x00!!!\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffZZZ\x00\x00\x00\x89\x89\x89\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x89\x89\x89\x00\x00\x00ZZZ\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb3\xb3\xb3\x00\x00\x00\x1e\x1e\x1e\xf6\xf6\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf6\xf6\xf6\x1e\x1e\x1e\x00\x00\x00\xb3\xb3\xb3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\xfd\xfd000\x00\x00\x00qqq\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffqqq\x00\x00\x00000\xfd\xfd\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\xc9\xc9\x05\x05\x05\x01\x01\x01\x94\x94\x94\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x94\x94\x94\x01\x01\x01\x05\x05\x05\xc9\xc9\xc9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x01\x01\x01\x00\x00\x00rrr\xf8\xf8\xf8\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8rrr\x00\x00\x00\x01\x01\x01\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x05\x05\x05\x00\x00\x00'''\xaa\xaa\xaa\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc\xfc\xaa\xaa\xaa'''\x00\x00\x00\x05\x05\x05\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc7\xc7\xc7)))\x00\x00\x00\x00\x00\x00\x1c\x1c\x1cnnn\xb0\xb0\xb0\xdb\xdb\xdb\xf7\xf7\xf7\xff\xff\xff\xf7\xf7\xf7\xdb\xdb\xdb\xb0\xb0\xb0nnn\x1c\x1c\x1c\x00\x00\x00\x00\x00\x00)))\xc7\xc7\xc7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xfa\x97\x97\x97%%%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%%%\x97\x97\x97\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\xc7\xc7\xc7~~~FFF\x1f\x1f\x1f\x08\x08\x08\x00\x00\x00\x08\x08\x08\x1f\x1f\x1fFFF~~~\xc7\xc7\xc7\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"

Code: Alles auswählen

<PIL.BmpImagePlugin.BmpImageFile image mode=RGB size=40x40 at 0x7F590C676790>
oder so:

Code: Alles auswählen

from pathlib import Path


IMAGE_PATH = Path('/home/dennis/Bilder')


def main():
    for image in IMAGE_PATH.iterdir():
        with open(image, "rb") as image_to_bytes:
            print(image_to_bytes.read())


if __name__ == '__main__':
    main()
ergibt:

Code: Alles auswählen

b"BM\xf6\x12\x00\x00\x00\x00\x00\x006\x00\x00\x00(\x00\x00\x00(\x00\x00\x00(\x00\x00\x00\x01\x00\x18\x00\x00\x00\x00\x00\xc0\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\xc7\xc7\xc7~~~FFF\x1f\x1f\x1f\x08\x08\x08\x00\x00\x00\x08\x08\x08\x1f\x1f\x1fFFF~~~\xc7\xc7\xc7\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xfa\x97\x97\x97%%%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%%%\x97\x97\x97\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc7\xc7\xc7)))\x00\x00\x00\x00\x00\x00\x1c\x1c\x1cnnn\xb0\xb0\xb0\xdb\xdb\xdb\xf7\xf7\xf7\xff\xff\xff\xf7\xf7\xf7\xdb\xdb\xdb\xb0\xb0\xb0nnn\x1c\x1c\x1c\x00\x00\x00\x00\x00\x00)))\xc7\xc7\xc7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x05\x05\x05\x00\x00\x00'''\xaa\xaa\xaa\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc\xfc\xaa\xaa\xaa'''\x00\x00\x00\x05\x05\x05\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x01\x01\x01\x00\x00\x00rrr\xf8\xf8\xf8\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8rrr\x00\x00\x00\x01\x01\x01\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\xc9\xc9\x05\x05\x05\x01\x01\x01\x94\x94\x94\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x94\x94\x94\x01\x01\x01\x05\x05\x05\xc9\xc9\xc9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\xfd\xfd000\x00\x00\x00qqq\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffqqq\x00\x00\x00000\xfd\xfd\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb3\xb3\xb3\x00\x00\x00\x1e\x1e\x1e\xf6\xf6\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf6\xf6\xf6\x1e\x1e\x1e\x00\x00\x00\xb3\xb3\xb3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffZZZ\x00\x00\x00\x89\x89\x89\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x89\x89\x89\x00\x00\x00ZZZ\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff!!!\x00\x00\x00\xd4\xd4\xd4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd4\xd4\xd4\x00\x00\x00!!!\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x05\x05\x00\x00\x00\xf9\xf9\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\xf9\xf9\x00\x00\x00\x00\x00\x00\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x05\x05\x00\x00\x00\xf9\xf9\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\xf9\xf9\x00\x00\x00\x00\x00\x00\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff!!!\x00\x00\x00\xd4\xd4\xd4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd4\xd4\xd4\x00\x00\x00!!!\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffZZZ\x00\x00\x00\x89\x89\x89\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x89\x89\x89\x00\x00\x00ZZZ\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb3\xb3\xb3\x00\x00\x00\x1e\x1e\x1e\xf6\xf6\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf6\xf6\xf6\x1e\x1e\x1e\x00\x00\x00\xb3\xb3\xb3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfd\xfd\xfd000\x00\x00\x00qqq\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffqqq\x00\x00\x00000\xfd\xfd\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\xc9\xc9\x05\x05\x05\x01\x01\x01\x94\x94\x94\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x94\x94\x94\x01\x01\x01\x05\x05\x05\xc9\xc9\xc9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x01\x01\x01\x00\x00\x00rrr\xf8\xf8\xf8\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf8\xf8rrr\x00\x00\x00\x01\x01\x01\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9b\x9b\x9b\x05\x05\x05\x00\x00\x00'''\xaa\xaa\xaa\xfc\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc\xfc\xaa\xaa\xaa'''\x00\x00\x00\x05\x05\x05\x9b\x9b\x9b\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc7\xc7\xc7)))\x00\x00\x00\x00\x00\x00\x1c\x1c\x1cnnn\xb0\xb0\xb0\xdb\xdb\xdb\xf7\xf7\xf7\xff\xff\xff\xf7\xf7\xf7\xdb\xdb\xdb\xb0\xb0\xb0nnn\x1c\x1c\x1c\x00\x00\x00\x00\x00\x00)))\xc7\xc7\xc7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfa\xfa\xfa\x97\x97\x97%%%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%%%\x97\x97\x97\xfa\xfa\xfa\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe\xfe\xc7\xc7\xc7~~~FFF\x1f\x1f\x1f\x08\x08\x08\x00\x00\x00\x08\x08\x08\x1f\x1f\x1fFFF~~~\xc7\xc7\xc7\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
Egal welches Ergebnis (scheint ja gleich zu sein) ich in dem MicroPython-Code einfüge, es kommt kein Kreis auf dem Display raus, sondern ein paar undefinierte Striche/Formen. Zumindest das weise Quadrat sieht nach den 40x40px aus.

Code: Alles auswählen

from machine import Pin, SPI
import st7789
from time import sleep
import framebuf

CYCLE = b"BM\xf6\..."

def main():
    spi = SPI(1, baudrate=30000000, polarity=0, phase=0)
    display = st7789.ST7789(
        spi, 135, 240,
        reset=Pin(4, Pin.OUT),
        cs= Pin(15,  Pin.OUT),
        dc=Pin(5, Pin.OUT)
    )
    display.init()
    frame_buffer = framebuf.FrameBuffer(bytearray(CYCLE), 40, 40 , framebuf.RGB565)
    display.blit_buffer(frame_buffer, 20, 50, 40, 40)



    
if __name__ == '__main__':
    main()
Im MP-Forum bin ich auf ein Thread gestoßen da wurde ein Smilie auf das Display gemalt, aber dafür wurde erst BMP in PBM gewandelt, siehe hier. Jetzt weis ich gar nicht wirklich wo ich mit der Fehlersuche anfangen soll. Mein Code, mein Bildformat? Wieso habe ich noch andere Bytes in meiner Ausgabe, ich erwarte eigentlch nur 'xff' und 'x00'.

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt keine fertige Methode, die schon so ein Ergebnis liefert. Du musst mit getdata die rohen Pixeldaten holen, und in einer for-Schleife pro Pixel deine zwei Bytes selbst schreiben.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dennis89: was Du hier siehst, ist der Inhalt einer BMP-Datei, also nicht nur die rohen Pixelwerte. Außerdem ist das immer noch im RGB-Format und nicht im 16bit-RGB565, wie Du es brauchst.
Aber mit Pillow ist es ja kein Problem, an die Pixel-Daten zu kommen und die Umrechnung von RGB auf RGB565 ist auch nicht allzu kompliziert.

@__deets__: mit numpy ist die Umrechnung ohne Schleife möglich.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

vielen Dank für die Erklärungen. Dass da ja noch andere Infos in der Datei stecken hatte ich gar nicht bedacht.
Ich hatte heute leider gar keine Zeit und jetzt macht die Restkapazität meines Hirns auch nicht mehr mit. Ich hoffe ich kann morgen oder über morgen weiter machen.
Wollte nur kurz Bescheid geben, dass eure Info/Hilfestellung angekommen ist.

Viele Grüße und gute Nacht
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen,

die Pixel auszulesen ist wirklich kein Problem, zu 'getdata' habe ich auch noch 'getpixel' gefunden.

Mittlerweile weis ich, das RGB für jede Farbe 8 Bits hat und RGB565 hat für rot und blau Bits und für grün 6.
Wenn rot jetzt den Wert 255 hat, also 11111111 dann muss ich daraus 11111 machen also 31.
Das wäre ja eigentlich eine einfache Rechnung: red / 255 * 31.
Oder, und das ist vielleicht mehr euer Geschmack, : red >> 3

Das würde ich jetzt für rot und blau machen und bei grün multipliziere ich halt 63, weil ein Bit mehr.

Wenn ein Pixel dann (255, 255, 255) hat, dann wäre das in RGB565 (31, 63, 31), richtig?
Jetzt habe ich die Farbe für jedes Pixel in RGB565. Muss ich die drei Zahlen jetzt noch in eine Hex-Zahl umwandeln?

Bin gerade nicht zu Hause und kann deswegen nur mal theoretisch fest halten, wie weit ich aktuell gekommen bin. Ich bin natürlich über Antworten dazu erfreut.

Danke und viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast drei Bytes, die zusammen eine 24bit-Zahl ergeben, deren Bits die Bedeutung rrrrrrrrggggggggbbbbbbbb haben.
Du willst zwei Bytes, die zusammen eine 16bit-Zahl ergeben, deren Bits die Bedeutung rrrrrggggggbbbbb haben sollen.
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Vielen Dank.
Dann erstelle ich zwei Bytes die jeweils 3 grüne Bits enthalten und 5 rote bzw. 5 blaue.

(r g , g b)
(1111 111, 111 11111)

Wie darf ich zum Beispiel rot und grün zusammenzählen?
31 + 63/2 wird ja nicht gehen, es gibt kein halbes Bit.
Betrachte ich dann die rei Bits extra und rechne 31 + 7?

Dann würde ich an der Stelle wo (255, 255, 255) steht (38, 38) an das Display übergeben?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wuerde erstmal klein anfangen, und ein Bild malen, dass schwarz und weiss ist, und dann einfach hart-kodierte Werte 0xffff und 0x0000 respektive schreiben, abhaengig davon, wie der 24-bit-wert aussieht.

Ansonsten ist es recht simpel: r, g und b sind jeweils

r = c >> 16 & 0xff
g = c >> 8 & 0xff
b = c & 0xff

rgb16 = (r >> 3) << 11 | (g >> 2) << 5 | (b >> 3)
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo und danke für die Antwort.

Mein Bild das ich gemalt habe ist schwarz-weiss.

Deine Rechnung verstehe ich so gar nicht. Also c wird durch 2**16 geteilt und dann wird das Ergebnis mit 255 verglichen, an der Stelle an der beide Zahlen den gleichen Wert haben wird eine 1 gesetzt und sonst eine Null. In dem Fall kommt 0 raus weil 00000000 mit 11111111 verglichen wird. Ich verstehe nicht was das Zwischenergebnis sein soll.

Dein Vorschlag mit den hart-kodierten Werten wollte ich eigentlich schon vor zwei Stunden umsetzen, gleich nach dem ich "kurz" die Rechnung angeschaut habe. Naja ich bin immer noch an der Rechnung und wäre mal wieder über etwas Input dankbar.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: `c` in der Rechnung ist ein 24-Bit-Wert der die drei Farben enthält, also rgb888 — 8 Bits pro Komponente. ``& 0xff`` maskiert alles über den 8 unteren Bits aus. Damit hat `r` dann nur den Rot-Anteil von dem Pixel.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen und vielen Dank.

Okay so macht das natürlich Sinn.

Nun wieder zurück:
Erst male ich mal ein Bild in dem ich einfach ein Array mit schwarzen und weissen Pixel erstelle, zum Beispiel mit Streifen:

Code: Alles auswählen

from machine import Pin, SPI
import st7789
from time import sleep
import framebuf


TEST = bytearray()


def main():
    spi = SPI(1, baudrate=30000000, polarity=0, phase=0)
    display = st7789.ST7789(
        spi, 135, 240,
        reset=Pin(4, Pin.OUT),
        cs= Pin(15,  Pin.OUT),
        dc=Pin(5, Pin.OUT)
    )
    display.init()
    for _ in range(200):
        TEST.append(0xffff)
    for _ in range(200):
        TEST.append(0x0000)
    for _ in range(200):
        TEST.append(0xffff)
    for _ in range(200):
        TEST.append(0x0000)
    frame_buffer = framebuf.FrameBuffer(TEST, 20, 20 , framebuf.RGB565)
    display.blit_buffer(frame_buffer, 20, 50, 20, 20)



    
if __name__ == '__main__':
    main()
Ganz bewusst die 'for'-Schleifen untereinander geschrieben. Das war jetzt für mich der Test, dass das klappt.

Ich habe ein Smilie gemalt, weisser Hintergrund und schwarzes Gesicht in einer 20x20px Größe.
Dann lese ich das aus und berechne die RGB565-Werte:

Code: Alles auswählen

from pathlib import Path
from PIL import Image

IMAGE_PATH = Path('/home/dennis/Bilder')


def main():
    for image in IMAGE_PATH.iterdir():
        with Image.open(image) as image_to_bytes:
            pixel = list(image_to_bytes.getdata())
        pixel_hex = ['0x%02x%02x%02x' % rgb for rgb in pixel]
        pixel_rgb565 = []
        for color in pixel_hex:
            r = int(color, 16) >> 16 & 0xff
            g = int(color, 16) >> 8 & 0xff
            b = int(color, 16) & 0xff
            pixel_rgb565.append((r >> 3) << 11 | (g >> 2) << 5 | (b >> 3))


if __name__ == '__main__':
    main()
Die 'pixel_rgb565'-Liste kopiere ich mir in mein MP-Programm:

Code: Alles auswählen

from machine import Pin, SPI
import st7789
from time import sleep
import framebuf


ARRAY_SIZE = 20 * 20 * 2
SMILIE = [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 52857, 35921, 52857, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 52857, 35921, 52857, 65535, 65535, 65535, 65535, 65535, 65535, 52857, 32, 0, 32, 52857, 65535, 65535, 65535, 65535, 65535, 52857, 32, 0, 32, 52857, 65535, 65535, 65535, 65535, 65535, 35921, 0, 0, 0, 35921, 65535, 65535, 65535, 65535, 65535, 35921, 0, 0, 0, 35921, 65535, 65535, 65535, 65535, 65535, 52857, 32, 0, 32, 52857, 65535, 65535, 65535, 65535, 65535, 52857, 32, 0, 32, 52857, 65535, 65535, 65535, 65535, 65535, 65535, 52857, 35921, 52857, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 52857, 35921, 52857, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 8452, 0, 8452, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 8452, 0, 8452, 65535, 65535, 65535, 65535, 65535, 8452, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 65535, 65535, 4258, 0, 0, 0, 8452, 65535, 65535, 65535, 65535, 0, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 4226, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 10565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 65535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 10565, 0, 0, 0, 0, 0, 0, 0, 0, 2113, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535]



def main():
    spi = SPI(1, baudrate=30000000, polarity=0, phase=0)
    display = st7789.ST7789(
        spi, 135, 240,
        reset=Pin(4, Pin.OUT),
        cs= Pin(15,  Pin.OUT),
        dc=Pin(5, Pin.OUT)
    )
    display.init()
    smilie = bytearray(ARRAY_SIZE)
    index = 0
    for pixel in SMILIE:
        smilie[index] = pixel
        smilie[index + 1] = pixel
        index += 2
    frame_buffer = framebuf.FrameBuffer(smilie, 20, 20 , framebuf.RGB565)
    display.blit_buffer(frame_buffer, 20, 50, 20, 20)



    
if __name__ == '__main__':
    main()


und erhalte tatsächlich den Smilie auf dem Display! :)
Juhu :) Jetzt habe ich aber echt auch lange gebraucht, bis ich drauf gekommen bin, das ich dass gleiche Pixel zwei mal hintereinander schreiben muss. Genau den Punkt habe ich auch noch nicht ganz verstanden, wieso reicht es nicht die Pixelfarbe einmal zu setzen? Ihr hattet ja geschrieben pro Pixel zwei Bits, deswegen ja die 20 * 20 * 2. Nur wieso und was da abläuft, das verstehe ich noch nicht ganz. Falls das aber zu tief geht, dann können wir es auch so belassen.

Vielen Dank!

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Das funktioniert so nur bei Schwarz/Weiss. Du musst nicht das gleiche Pixel zweimal hintereinander schreiben sondern die 16 Bit pro Pixel auf zwei aufeinanderfolgende Bytes verteilen. 65535 passt ja nicht in ein Byte. Das sind zwei. Und bei *diesem* Wert sind beide Bytes zufällig 255, also ”funktioniert” das zufällig die 65535 in beide Bytes für das Pixel zu schreiben, denn die Zuweisung schmeisst die oberen 8 Bits von dem Wert einfach weg.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Reichlich kompliziert, erst die rot, grün und blau-Werte in einem String zusammenzupappen, den dann in eine Zahl umzuwandeln, um dann zum Schluß doch wieder daraus rot, grün und blau zu berechnen.
Das ganze Programm tut ja sowieso nichts, weil mit `pixel_rgb565` nichts gemacht wird.
Ein Bild `image_to_bytes` zu nennen, ist verwirrend. Denn das Image willst Du ja erst noch in "Bytes" (aber eher in RGB565-Werte) umwandeln.
Über das getdata-Objekt kann man direkt iterieren, das muß man nicht erst in eine Liste umwandeln. Und mit den r,g,b-Werten kann man direkt weiterarbeiten.
Bleibt also

Code: Alles auswählen

with Image.open(image) as image:
    pixel_rgb565 = [
        (r >> 3) << 11 | (g >> 2) << 5 | (b >> 3)
        for r, g, b in image.getdata()
    ]
Oder um das einigermaßen Performant zu machen:

Code: Alles auswählen

with Image.open(image) as image:
    pixel = numpy.array(image).astype('u2')
    pixel_rgb565 = (pixel[..., 0] >> 3) << 11 | (pixel[..., 1] >> 2) << 5 | (pixel[..., 2] >> 3)
Das Darstellen auf dem ST7789 ist dann komplett falsch. Du hast und brauchst 16bit-Werte. Was Du tust, ist für jedes Pixel zweimal die unteren 8 Bit der 16bit-Werte zu kopieren.
Wenn man das wirklich per for-Schleife machen möchte, dann sähe das korrekte kopieren so aus:

Code: Alles auswählen

    smilie = bytearray(ARRAY_SIZE)
    for index, pixel in enumerate(SMILIE):
        smilie[2 * index] = pixel >> 8
        smilie[2 * index + 1] = pixel & 0xff
Effizienter wäre:

Code: Alles auswählen

smilie = array.array('H', SMILIE).tobytes()
Oder gleich als Bytes, weil die Zahlen genauso lesbar sind wie das hier:

Code: Alles auswählen

smilie = (
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xffy\xceQ\x8cy\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffy\xceQ\x8cy\xce\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xffy\xce \x00\x00\x00 \x00y\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffy\xce \x00\x00\x00 \x00y\xce\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xffQ\x8c\x00\x00\x00\x00\x00\x00Q\x8c\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffQ\x8c\x00\x00\x00\x00\x00\x00Q\x8c\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xffy\xce \x00\x00\x00 \x00y\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffy\xce \x00\x00\x00 \x00y\xce\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xffy\xceQ\x8cy\xce\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffy\xceQ\x8cy\xce\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\x04!\x00\x00\x04!\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04!\x00\x00\x04!\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\x04!\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa2\x10\x00\x00\x00\x00\x00\x00\x04!\xff\xff\xff\xff\xff\xff'
b'\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x82\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff'
b'\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff'
b'\xff\xffE)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xffE)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\x08\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff')
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

__blackjack__ hat geschrieben: Donnerstag 15. September 2022, 10:43 16 Bit pro Pixel auf zwei aufeinanderfolgende Bytes verteilen. 65535 passt ja nicht in ein Byte.
Danke für die Erklärung, jetzt macht das natürlich Sinn.
Wenn das so weiter geht, dann könnte der Zeitpunkt kommen, an dem ich das tatsächlich verstanden habe. :mrgreen:

Reichlich kompliziert,
Ja das ist Schritt für Schritt entstanden und so wollte ich es dann auch wiedergeben. Vorallem habe ich mir immer wieder Zwischenergebnisse ausgeben lassen um zu verstehen und schauen ob das mit meiner Vorstellung übereinstimmt.
Das ganze Programm tut ja sowieso nichts, weil mit `pixel_rgb565` nichts gemacht wird.
Sorry, da habe ich ein 'print' zu viel gelöscht.

NumPy steht schon lange auf meiner ToDo-Liste und außer ganz kurz eingelesen, ist in der Hinsicht leider noch nichts passiert. (Hatte auch deinen Satz im Hinterkopf, das man mit NumPy auf 'for'-Schleifen verzichten kann.)

Code: Alles auswählen

Das Darstellen auf dem ST7789 ist dann komplett falsch.
Die Freude war nur kurz groß, dass war der erste Satz den ich las als ich den Thread öffnete.
Den Fehler habe ich zum Glück verstanden.
Ich werde mal noch ein paar Versuche machen und mich wieder melden, mal sehen ob mit mehr oder weniger Erfolg.

Vielen Dank für eure tolle Hilfe!

Grüße
Dennis

P.S.
weil die Zahlen genauso lesbar sind wie das hier:
Schön formatiert, da sieht man gleich meine künstlerische Fähigkeit. :o
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

Bild

Freue mich immer wieder hier zu sein und bin immer wieder über eure Geduld erstaunt! (über euer Wissen ja so oder so)

Grüße
Dennis

Sorry dass das Bild aussieht wie von einem Kleinkind gemalt :D
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Abend,

es gibt Neuigkeiten von der Schweißmaschine. Die Maschine ist soweit aufgebaut und will natürlich getestet werden.
Meine Elektronik ist natürlich immer noch auf dem Steckbrett aufgebaut, da die Ganzen erst mal getestet werden muss.

Um die Mechanik zu testen habe ich mir einen ESP geschnappt, ein kleines Display, einen Motortreiber, einen Poti, einen Optokoppler, und einen Schalter mit drei Stellungen.
Das habe ich alles in ein Plastikgehäuse gesteckt und fertig war die provisorische Steuerung zum testen der Vorrichtung.

Das läuft so ab: Wenn der Schalter in der Mittelstellung ist dann steht der Motor. Mit dem Poti kann die Drehzahl eingestellt werden. Diese wird in roter Schrift auf dem Display von 0% - 100% ausgegeben. Schaltet man den Schalter "nach oben" dann startet der Motor in der eingestellten Drehzahl, diese wird dabei in grün angezeigt und es ist möglich während des Betriebs die Drezhal mit dem Poti zu ändern. Mit dem Motor schält auch der Optokoppler und schält damit den Schweissbrenner ein.
Schalter wieder zurück in die Mitte und alles stoppt.

Man bewegt den Schweissbrenner aber nicht gleich wenn der erste Funke überspringt, sondern man wartet ab bis ein angemessenes Schweißbad entsteht. Aus diesem Grund kann man den Schalter auch noch nach "unten" stellen, dann kann man mit dem Poti eine Verzögerungszeit einstellen. Dann zurück in die Mitte, die gewünschte Drehzahl einstellen und nach "oben". Das Schweissgerät wird eingeschalten, die Zeit läuft ab und dann startet der Motor.

Erste Tests waren erfolgreich. :)

Hier die Schweißnaht:
https://www.dropbox.com/s/24xmchfkphg2c ... .jpeg?dl=0

Wir haben mit dem Positionsmessungen zwar gezeigt, dass theoretisch ein PID-Regler notwenig wäre, das kann man an der Schweißnaht nicht erkennen. Die Testvorrichtung regelt gar nichts und ist auch an keinen Encoder oder sonstiges angeschlossen. Es werden stur die PWM-Werte abhängig von der Poti-Stellung gesendet. Ich bin gespannt wie die weiteren Tests verlaufen.

Für mich wäre das natürlich eine wesentliche Erleichterung.

Was aber hinzukommen wird für die entgültige Steuerung ist das Problem das während des Schweißprozess das Grundmaterial wärmer wird, wie zu Beginn. Dadurch verhält sich das Schweißbad anders, in dem Fall wird es breiter und flacher. Wenn ich Schweisse merke ich das und bewege den Brenner schneller. Der ESP merkt das aber nicht, dennoch wäre es schön wenn der Motor sich zu diesem Zeitpunkt schneller dreht.
Wie ich das umsetze weis ich noch nicht, vermutlich wird über das Display dann der Winkel eingegeben ab welchem die Drehzahl um einen bestimmten Wert erhöht werden soll. Ich denke das muss man dann experimentell herausfinden.

So viel zum aktuellen Stand 😊

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten