PNG aus einem Puffer
Was dieses Beispiel zeigt
Liest eine PNG-Datei von der microSD-Karte in einen Puffer im RAM und zeichnet sie anschließend aus diesem Puffer. Dieselbe Technik funktioniert für PNG-Daten aus jeder anderen Quelle, etwa einer Netzwerkverbindung oder einer seriellen Übertragung, da die Zeichenfunktion einen Speicherpuffer statt einer Datei erwartet.
Sie benötigen eine mit FAT oder FAT32 formatierte microSD-Karte mit einer Datei namens image.png, die in den Inkplate eingesteckt ist. Laut den Kommentaren des Sketches darf das PNG 800 x 480 Pixel nicht überschreiten, und die gesamte Datei wird zuerst in den Heap-Speicher geladen, sie muss also in den freien RAM passen (etwa 300 KB beim ESP32).
Beispielcode
#include "Inkplate.h"
Inkplate display;
void setup()
{
display.begin();
display.clearDisplay();
display.setTextColor(BLACK);
display.setTextSize(1);
if (!display.sdCardInit())
{
display.println("SD card error!");
display.display();
return;
}
SdFile file;
if (!file.open("image.png", O_RDONLY))
{
display.println("Cannot open image.png");
display.display();
display.sdCardSleep();
return;
}
uint32_t fileSize = file.fileSize();
// Allocate a buffer large enough for the whole file
uint8_t *buf = (uint8_t *)malloc(fileSize);
if (!buf)
{
display.println("Not enough RAM for image buffer!");
display.display();
file.close();
display.sdCardSleep();
return;
}
// Read the entire file into the buffer
file.read(buf, fileSize);
file.close();
display.sdCardSleep();
// Draw the PNG from the in-memory buffer
if (!display.image.drawPngFromBuffer(buf, fileSize, 0, 0, true, false))
{
display.println("PNG decode error");
}
free(buf);
display.display();
}
void loop()
{
// Nothing...
}
Verwendete Funktionen
Inkplate()returns NoneErstellt das Inkplate-Objekt. Inkplate 7SPECTRA hat einen einzigen Sechs-Farben-Modus, daher benötigt der Konstruktor kein Modus-Argument.
ReturnsKonstruktor; kein Rückgabewert.
display.begin()returns voidInitialisiert die Bibliothek, die Peripherie und den Framebuffer. Einmal in setup() aufrufen.
ReturnsNichts.
display.clearDisplay()returns voidFüllt den Framebuffer mit Weiß. Das Panel wird dadurch nicht verändert.
ReturnsNichts.
display.setTextColor(uint16_t c)returns voidLegt die Textfarbe für die Fehlermeldungen fest, hier BLACK.
ReturnsNichts.
display.setTextSize(uint8_t s)returns voidLegt die Textvergrößerung fest, hier 1.
ReturnsNichts.
display.sdCardInit()returns int16_tSchaltet die Versorgung der microSD-Karte ein, startet ihren SPI-Bus und bindet die Karte ein.
Returns1, wenn die Karte initialisiert wurde, 0 bei einem Fehler.
SdFile()returns NoneSdFat-Klasse, mit der Inkplate-Bibliothek mitgeliefert: ein Dateiobjekt auf der microSD-Karte. Der Sketch erstellt eines mit dem Namen `file`.
ReturnsKonstruktor; kein Rückgabewert.
file.open(path, mode)returns boolSdFat-Funktion, mit der Inkplate-Bibliothek mitgeliefert: öffnet eine Datei auf der Karte. Der Sketch übergibt O_RDONLY, um sie zum Lesen zu öffnen.
Returnstrue, wenn die Datei geöffnet wurde.
file.fileSize()returns uint32_tSdFat-Funktion: gibt die Größe der geöffneten Datei in Bytes zurück. Der Sketch reserviert einen Puffer dieser Größe.
ReturnsDateigröße in Bytes.
file.read(void *buf, size_t count)returns intSdFat-Funktion: liest bis zu count Bytes aus der Datei in den Puffer. Der Sketch liest die gesamte Datei.
ReturnsAnzahl der gelesenen Bytes.
file.close()returns boolSdFat-Funktion: schließt die Datei.
Returnstrue bei Erfolg.
malloc(size_t size) and free(void *ptr)returns void *Funktionen der C-Standardbibliothek: reservieren den Puffer im Heap-Speicher und geben ihn wieder frei, nachdem das Bild gezeichnet wurde. Wenn malloc nichts zurückgibt, zeigt der Sketch Not enough RAM for image buffer! an.
Returnsmalloc gibt den Puffer zurück, oder NULL, wenn nicht genug Speicher vorhanden ist; free gibt nichts zurück.
display.image.drawPngFromBuffer(uint8_t *buf, int32_t len, int x, int y, bool dither = 0, bool invert = 0)returns boolDekodiert ein im Speicher liegendes PNG und zeichnet es in den Framebuffer, mit der oberen linken Ecke bei (x, y). Der Sketch übergibt den Puffer und seine Größe, die Position (0, 0), Dithering ein und Invertierung aus. Die Farben werden auf die sechs Panelfarben abgebildet.
Returnstrue, wenn das Bild gezeichnet wurde, false, wenn es nicht dekodiert werden konnte.
display.sdCardSleep()returns voidSetzt die SPI-Pins der Karte auf Eingänge und schaltet die Versorgung der Karte ab, um im Deep Sleep Strom zu sparen.
ReturnsNichts.
display.println(text)returns size_tGibt Text in den Framebuffer aus und springt in die nächste Zeile. Der Sketch verwendet es für seine Fehlermeldungen.
ReturnsAnzahl der ausgegebenen Bytes.
display.display(bool _leaveOn = 0)returns voidSendet den gesamten Framebuffer an das Panel und aktualisiert es.
ReturnsNichts.
Was Sie erwarten können
Das PNG von der Karte wird auf dem Bildschirm angezeigt, mit Dithering auf die sechs Farben des Panels. Der Sketch gibt nichts im Serial Monitor aus. Probleme werden stattdessen auf dem Bildschirm angezeigt: SD card error!, Cannot open image.png, Not enough RAM for image buffer! oder PNG decode error.
🔗Vollständiges Beispiel öffnen
examples/Inkplate7SPECTRA/Advanced/Other/Inkplate7SPECTRA_PNG_From_Buffer