ich habe mich lange gesträubt, das Thema schon wieder anzufangen, aber ich verstehe es einfach nicht.
Wir hatte das schon mal, das ich ein Bild in RGB565 wandeln wollte und es dann über einen Mikrokontroller auf einem kleinen Display darstellen wollte.
Jetzt ist es genau das Gleiche vom Prinzip, das Display ist anders und der Mikrokontroller etwas größer.
Ich habe einen ESP32 und ein 0,96" OLED Display mit 128x64Pixel und einem SSD1306-Chip.
Ich verwende dafür diese Bibliothek:
https://github.com/stlehmann/micropython-ssd1306
und den Hardware I2C-Bus.
Ich habe ein Bild mit 110x64 Pixel im BMP-Format und wandle das in RGB565 mit folgendem Code auf dem Laptop um:
Code: Alles auswählen
from pathlib import Path
from PIL import Image
IMAGE = Path("/home/dennis/Bilder/mario_e.bmp")
def main():
with Image.open(IMAGE) as image:
pixel_rgb565 = [
(r >> 3) << 11 | (g >> 2) << 5 | (b >> 3) for r, g, b in image.getdata()
]
print(pixel_rgb565)
if __name__ == "__main__":
main()
Die Liste die rauskommt speichere ich auf dem ESP in der Datei 'Mario.py' und die sieht dann so aus:
Code: Alles auswählen
mario = [65400, 63320, 65332, 65331, 63250, 65266, 63125, 48205, 56687, 58638, 52266, 47977,...
Code: Alles auswählen
from ssd1306 import SSD1306_I2C
from machine import Pin, I2C
from Mario import mario
import framebuf
SDA_PIN = 17
SCL_PIN = 16
ARRAY_SIZE = 110 * 64 * 2
def main():
i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN), freq=400000)
display = SSD1306_I2C(width=128, height=64, i2c=i2c)
mario_image = bytearray(ARRAY_SIZE)
for index, pixel in enumerate(mario):
mario_image[2 * index] = pixel >> 8
mario_image[2 * index + 1] = pixel & 0xff
frame_buffer = framebuf.FrameBuffer(mario_image, 110, 64, framebuf.RGB565)
display.blit(frame_buffer, 0, 0)
display.show()
if __name__ == '__main__':
main()
Hier habe ich im Vergleich zum letzten mal einen Unterschied. Die ssd1306-Klasse erbt (ist der Begriff hier richtig?) von framebuf.Framebuffer und deswegen kann ich 'display.blit' aufrufen.
In meinem letzten Programm hatte ich einen Aufruf 'blit_buffer' und der hat noch die Höhe und Breite als Argument angenommen, 'blit' aber nicht.
Mein letzter Code mit dem Problem war der hier und ein Post darunter folgten dann die korrekten Code-Stücke von Sirius3.
Der aktuelle Code gibt mir einfach ein weißes Rechteck aus. Die Pixelgröße und die Position stimmen mit dem Code überein, aber es ist leider kein Bild zu erkennen.
blit hat ja noch 'key' und 'palette' als Argument, aber ob und was ich da übergeben soll, verstehe ich gar nicht bzw. ich verstehe die Anwendung von denen zwei Argumenten nicht. Liegt darin mein Problem oder mache ich wieder grundsätzlich was falsch?
Danke, dass ihr euch das Problem schon wieder anschaut.
Viele Grüße
Dennis