Zum Hauptinhalt springen

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​

Select Board
Inkplate7SPECTRA_PNG_From_Buffer.ino
#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 None

Erstellt 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 void

Initialisiert die Bibliothek, die Peripherie und den Framebuffer. Einmal in setup() aufrufen.

ReturnsNichts.

display.clearDisplay()returns void

Füllt den Framebuffer mit Weiß. Das Panel wird dadurch nicht verändert.

ReturnsNichts.

display.setTextColor(uint16_t c)returns void

Legt die Textfarbe für die Fehlermeldungen fest, hier BLACK.

ReturnsNichts.

display.setTextSize(uint8_t s)returns void

Legt die Textvergrößerung fest, hier 1.

ReturnsNichts.

display.sdCardInit()returns int16_t

Schaltet 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 None

SdFat-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 bool

SdFat-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_t

SdFat-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 int

SdFat-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 bool

SdFat-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 bool

Dekodiert 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 void

Setzt 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_t

Gibt 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 void

Sendet 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

→