klasa ImageIO – obiekt ImageIO

Klasa ImageIO zapisuje i odtwarza strumienie ramek Image w natywnym, dyskowym formacie OpenMV. Pojedynczy strumień może przechowywać heterogeniczne ramki (o różnych formatach pikseli / rozmiarach) i zapisuje dla każdej z nich odstęp między ramkami, dzięki czemu odtwarzanie odtwarza oryginalną liczbę klatek na sekundę.

Istnieją dwa magazyny zaplecza:

  • Strumień plikowy – ramki są odczytywane z pliku w systemie plików / dopisywane do niego. Plik zaczyna się od 16-bajtowego nagłówka magicznego OMV IMG STR Vx.y, po którym następują fragmenty poszczególnych ramek. Bieżący moduł zapisujący generuje V2.0; starsze pliki V1.0 i V1.1 są nadal odczytywalne.

  • Strumień pamięciowy – ramki są odczytywane z bufora RAM o stałym rozmiarze, przydzielonego w czasie konstrukcji / do niego zapisywane. Przydatne do przepuszczania ramek przez filtry, które wymagają nagrania, bez naruszania systemu plików.

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

Tworzy strumień ImageIO.

Jeśli path jest łańcuchem znaków, otwierany jest strumień plikowy pod tą ścieżką. mode musi być jednym z:

  • 'r' – otwiera istniejący plik do odczytu. Nagłówek magiczny jest weryfikowany, a wersja (V1.0 / V1.1 / V2.0) jest zapisywana do użytku przez version().

  • 'w' – obcina / tworzy plik i zapisuje świeży nagłówek magiczny V2.0. Ramki są dopisywane przy każdym write().

Jeśli path jest 3-elementową krotką (w, h, pixformat), przydzielany jest strumień pamięciowy. mode jest wtedy całkowitą liczbą gniazd ramek do wstępnego przydzielenia. Bufor ma rozmiar dla count ramek o (w, h, pixformat) i nie może rosnąć po utworzeniu. pixformat jest jednym z image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG lub image.PNG. Dla formatów skompresowanych (image.JPEG, image.PNG) rozmiar na gniazdo szacowany jest na 2 bpp; ramki większe niż oszacowanie zgłaszają ValueError w czasie wywołania write().

Inspekcja

type() int

Zwraca magazyn zaplecza strumienia: FILE_STREAM dla strumienia plikowego, MEMORY_STREAM dla strumienia pamięciowego.

is_closed() bool

Zwraca True, jeśli na tym obiekcie wywołano close(). Po zamknięciu strumień zgłasza OSError("Stream closed") przy każdej dalszej operacji odczytu/zapisu/przewijania.

count() int

Zwraca liczbę ramek aktualnie przechowywanych w strumieniu. Dla strumieni plikowych rośnie ona w miarę dopisywania ramek przez write(); dla strumieni pamięciowych jest stała w czasie konstrukcji.

offset() int

Zwraca bieżący indeks ramki. Zwiększany przez read() i write(), zerowany przez seek().

version() int | None

Zwraca wersję formatu dyskowego dla strumieni plikowych (10 dla V1.0, 11 dla V1.1, 20 dla V2.0). Zwraca None dla strumieni pamięciowych.

buffer_size() int | None

Zwraca rozmiar bufora pikseli na gniazdo w bajtach dla strumieni pamięciowych (rozmiar gniazda pomniejszony o wewnętrzny nagłówek księgowy Image). Zwraca None dla strumieni plikowych. Użyj tego razem z count(), aby sprawdzić, czy dany rozmiar ramki się zmieści.

size() int

Zwraca łączną liczbę bajtów zajmowaną przez strumień – rozmiar pliku na dysku dla strumieni plikowych lub pełny rozmiar bufora RAM (count * per_slot_size, wliczając nagłówek na gniazdo) dla strumieni pamięciowych.

Wejście/wyjście

write(img: Image) ImageIO

Dopisuje (strumień plikowy) lub zapisuje pod przesunięciem (strumień pamięciowy) img i zwiększa offset() o jeden.

Dla strumieni plikowych plik rośnie w miarę dopisywania ramek. Zapis pod przesunięciem innym niż koniec obcina resztę pliku, dzięki czemu liczba ramek może się zmniejszyć.

Dla strumieni pamięciowych ramka jest zapisywana do bieżącego gniazda; zapis poza ostatnim gniazdem zgłasza EOFError("End of stream"), a zapis ramki większej niż buffer_size() zgłasza ValueError("Invalid frame size").

Zwraca self, dzięki czemu wywołania można łączyć w łańcuch.

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

Odczytuje ramkę spod bieżącego offset(), zwiększa przesunięcie i zwraca nowy Image. Odzwierciedla odtwarzającą połowę write().

copy_to_fb – gdy True (domyślnie), zdekodowana ramka jest umieszczana w buforze ramki kamery (w tym samym miejscu, gdzie trafia csi.CSI.snapshot()), dzięki czemu zwracany Image można rysować w podglądzie IDE. Gdy False, ramka jest zamiast tego przydzielana na stercie MicroPython.

loop (tylko strumienie plikowe) – gdy True (domyślnie), odczyt poza ostatnią ramką przewija z powrotem do pierwszej ramki i kontynuuje. Gdy False, wywołanie zwraca None po osiągnięciu końca pliku.

pause – gdy True (domyślnie), wywołanie blokuje do upłynięcia pierwotnie zarejestrowanego odstępu między ramkami, dzięki czemu odtwarzanie przebiega z natywną liczbą klatek na sekundę nagrania. Ustaw na False, aby odtwarzać tak szybko, jak to możliwe.

seek(offset: int) ImageIO

Przesuwa offset() do ramki offset. offset musi być nieujemne; przesunięcia strumienia pamięciowego muszą być także mniejsze niż count().

Przewijanie w strumieniu plikowym przechodzi przez plik ramka po ramce od początku, ponieważ fragmenty ramek mają zmienny rozmiar – przy dużych skokach należy oczekiwać czasu O(offset).

Zwraca self, dzięki czemu wywołania można łączyć w łańcuch.

sync() ImageIO

Opróżnia oczekujące zapisy na dysk dla strumieni plikowych (wywołuje sync na poziomie systemu plików). Brak operacji dla strumieni pamięciowych.

Zwraca self, dzięki czemu wywołania można łączyć w łańcuch.

close() None

Zamyka strumień. Zwalnia bufor pamięci (strumienie pamięciowe) lub zamyka plik (strumienie plikowe). Po close() obiektu ImageIO nie można ponownie użyć; kolejne operacje zgłaszają OSError("Stream closed"). Dwukrotne wywołanie close() jest operacją pustą.

ImageIO jest także zamykany automatycznie, gdy zostaje usunięty przez odśmiecacz pamięci (rejestruje finalizator w czasie konstrukcji).

Stałe

FILE_STREAM: int

Wartość zwracana przez type() dla strumieni opartych na pliku.

MEMORY_STREAM: int

Wartość zwracana przez type() dla strumieni w pamięci.