class ImageIO – ImageIO-Objekt

Die Klasse ImageIO zeichnet Streams von Image-Einzelbildern in OpenMVs nativem Festplattenformat auf und gibt sie wieder. Ein einzelner Stream kann heterogene Einzelbilder enthalten (unterschiedliche Pixelformate / Größen) und zeichnet das Intervall zwischen den Einzelbildern für jedes auf, sodass die Wiedergabe die ursprüngliche Bildrate wiederherstellt.

Es gibt zwei Speicherorte:

  • Datei-Stream – Einzelbilder werden aus einer Datei im Dateisystem gelesen bzw. an sie angehängt. Die Datei beginnt mit einem 16-Byte-Magic-Header OMV IMG STR Vx.y, gefolgt von Chunks pro Einzelbild. Der aktuelle Writer gibt V2.0 aus; ältere V1.0- und V1.1-Dateien sind weiterhin lesbar.

  • Speicher-Stream – Einzelbilder werden aus einem zur Konstruktionszeit zugewiesenen RAM-Puffer fester Größe gelesen bzw. in ihn geschrieben. Nützlich, um Einzelbilder durch Filter zu schleusen, die eine Aufzeichnung benötigen, ohne das Dateisystem anzutasten.

class image.ImageIO(path: str | Tuple[int, int, int], mode: str | int)

Erstellt einen ImageIO-Stream.

Ist path ein String, wird ein Datei-Stream an diesem Pfad geöffnet. mode muss einer der folgenden sein:

  • 'r' – öffnet eine vorhandene Datei zum Lesen. Der Magic-Header wird validiert und die Version (V1.0 / V1.1 / V2.0) wird zur Verwendung durch version() aufgezeichnet.

  • 'w' – kürzt die Datei / erstellt sie und schreibt einen frischen V2.0-Magic-Header. Bei jedem write() werden Einzelbilder angehängt.

Ist path ein 3-Tupel (w, h, pixformat), wird ein Speicher-Stream zugewiesen. mode ist dann die ganzzahlige Anzahl der vorab zuzuweisenden Einzelbild-Slots. Der Puffer wird für count Einzelbilder von (w, h, pixformat) dimensioniert und darf nach der Erstellung nicht wachsen. pixformat ist eines von image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG oder image.PNG. Für die komprimierten Formate (image.JPEG, image.PNG) wird die Größe pro Slot mit 2 bpp geschätzt; Einzelbilder, die größer als die Schätzung sind, lösen zur write()-Zeit ValueError aus.

Inspektion

type() int

Gibt den Speicherort des Streams zurück: FILE_STREAM für einen Datei-Stream, MEMORY_STREAM für einen Speicher-Stream.

is_closed() bool

Gibt True zurück, wenn close() für dieses Objekt aufgerufen wurde. Nach dem Schließen löst der Stream bei jedem weiteren Lese-/Schreib-/Seek-Vorgang OSError("Stream closed") aus.

count() int

Gibt die Anzahl der aktuell im Stream gespeicherten Einzelbilder zurück. Bei Datei-Streams wächst diese, wenn write() Einzelbilder anhängt; bei Speicher-Streams ist sie zur Konstruktionszeit festgelegt.

offset() int

Gibt den aktuellen Einzelbild-Index zurück. Wird durch read() und write() inkrementiert und durch seek() zurückgesetzt.

version() int | None

Gibt die Festplatten-Formatversion für Datei-Streams zurück (10 für V1.0, 11 für V1.1, 20 für V2.0). Gibt None für Speicher-Streams zurück.

buffer_size() int | None

Gibt die Pixelpuffergröße pro Slot in Bytes für Speicher-Streams zurück (die Slot-Größe abzüglich des internen Image-Verwaltungs-Headers). Gibt None für Datei-Streams zurück. Verwenden Sie dies zusammen mit count(), um zu prüfen, ob eine bestimmte Einzelbildgröße passt.

size() int

Gibt die gesamten vom Stream belegten Bytes zurück – die Dateigröße auf der Festplatte bei Datei-Streams oder die volle RAM-Puffergröße (count * per_slot_size einschließlich des Headers pro Slot) bei Speicher-Streams.

I/O

write(img: Image) ImageIO

Hängt img an (Datei-Stream) bzw. speichert es an der Offset-Position (Speicher-Stream) und erhöht offset() um eins.

Bei Datei-Streams wächst die Datei, wenn Einzelbilder angehängt werden. Das Schreiben an einem Offset, der nicht am Ende liegt, kürzt den Rest der Datei, sodass die Anzahl schrumpfen kann.

Bei Speicher-Streams wird das Einzelbild in den aktuellen Slot geschrieben; das Schreiben über den letzten Slot hinaus löst EOFError("End of stream") aus, und das Schreiben eines Einzelbilds, das größer als buffer_size() ist, löst ValueError("Invalid frame size") aus.

Gibt self zurück, sodass Aufrufe verkettet werden können.

read(copy_to_fb: bool = True, *, loop: bool = True, pause: bool = True) Image | None

Liest das Einzelbild am aktuellen offset(), erhöht den Offset und gibt das neue Image zurück. Spiegelt die Wiedergabe-Hälfte von write() wider.

copy_to_fb – wenn True (Standard), wird das dekodierte Einzelbild in den Kamera-Framebuffer gelegt (dieselbe Stelle, an der ein csi.CSI.snapshot() landet), sodass das zurückgegebene Image über die IDE-Vorschau zeichenbar ist. Wenn False, wird das Einzelbild stattdessen auf dem MicroPython-Heap zugewiesen.

loop (nur Datei-Streams) – wenn True (Standard), springt das Lesen über das letzte Einzelbild hinaus zum ersten Einzelbild zurück und fährt fort. Wenn False, gibt der Aufruf None zurück, sobald das Ende der Datei erreicht ist.

pause – wenn True (Standard), blockiert der Aufruf, bis das ursprünglich aufgezeichnete Intervall zwischen den Einzelbildern verstrichen ist, sodass die Wiedergabe mit der nativen Bildrate der Aufzeichnung läuft. Auf False setzen für eine so schnell wie mögliche Wiedergabe.

seek(offset: int) ImageIO

Verschiebt offset() zum Einzelbild offset. offset muss nicht negativ sein; Speicher-Stream-Offsets müssen zudem kleiner als count() sein.

Datei-Stream-Seeks durchlaufen die Datei Einzelbild für Einzelbild vom Anfang an, da Einzelbild-Chunks variable Größen haben – rechnen Sie bei großen Sprüngen mit O(offset)-Zeit.

Gibt self zurück, sodass Aufrufe verkettet werden können.

sync() ImageIO

Schreibt ausstehende Schreibvorgänge bei Datei-Streams auf die Festplatte (ruft das sync des zugrunde liegenden Dateisystems auf). Bei Speicher-Streams ohne Wirkung.

Gibt self zurück, sodass Aufrufe verkettet werden können.

close() None

Schließt den Stream. Gibt den Speicherpuffer frei (Speicher-Streams) oder schließt die Datei (Datei-Streams). Nach close() kann das ImageIO-Objekt nicht wiederverwendet werden; nachfolgende Operationen lösen OSError("Stream closed") aus. Ein zweimaliger Aufruf von close() hat keine Wirkung.

Ein ImageIO wird auch automatisch geschlossen, wenn es vom Garbage Collector eingesammelt wird (es registriert zur Konstruktionszeit einen Finalizer).

Konstanten

FILE_STREAM: int

Wert, der von type() für dateigestützte Streams zurückgegeben wird.

MEMORY_STREAM: int

Wert, der von type() für In-Memory-Streams zurückgegeben wird.