framebuf — manipulacja buforem ramki

Moduł framebuf udostępnia niewielki bufor pikseli bez alokacji wraz z podstawowymi operacjami rysowania. Jest przeznaczony do sterowania zewnętrznymi wyświetlaczami (OLED, LCD, e-papier itp.).

Informacja

Do przetwarzania przechwyconych ramek używaj znacznie bogatszej klasy image.Image z OpenMV – oferuje ona o wiele więcej prymitywów rysowania, konwersji kolorów i funkcji analizy niż framebuf.

class FrameBuffer

A FrameBuffer wraps a user-supplied buffer-protocol object (typically a bytearray) and exposes methods to draw pixels, lines, rectangles, ellipses, polygons, text and other FrameBuffers into it.

Przykład:

import framebuf

# FrameBuffer needs 2 bytes for every RGB565 pixel.
fbuf = framebuf.FrameBuffer(bytearray(100 * 10 * 2), 100, 10, framebuf.RGB565)

fbuf.fill(0)
fbuf.text("MicroPython!", 0, 0, 0xffff)
fbuf.hline(0, 9, 96, 0xffff)

Konstruktory

class framebuf.FrameBuffer(buffer: Any, width: int, height: int, format: int, stride: int | None = None, /)

Tworzy obiekt FrameBuffer.

  • buffer – dowolny obiekt obsługujący protokół bufora; musi być wystarczająco duży, aby pomieścić stride * height pikseli w wybranym format.

  • width – szerokość bufora ramki w pikselach.

  • height – wysokość bufora ramki w pikselach.

  • format – format piksela; jedna ze stałych wymienionych poniżej w Stałe. Format określa zarówno rozmiar każdego piksela w buffer, jak i sposób interpretacji liczby całkowitej koloru c przekazanej do dowolnej metody rysowania.

  • stride – liczba pikseli w każdym poziomym wierszu, wliczając wszelkie wypełnienie. Domyślnie width. Ustaw tę wartość, aby użyć podregionu większego bufora.

Przekazanie zbyt małego buffer lub nieprawidłowych wymiarów spowoduje niezdefiniowane wyniki – konstruktor nie sprawdza każdej kombinacji.

Metody rysowania

FrameBuffer.fill(c: int) None

Wypełnia cały bufor ramki kolorem c.

FrameBuffer.fill_rect(x: int, y: int, w: int, h: int, c: int) None

Wypełnia prostokąt w x h w punkcie (x, y) kolorem c. Równoważne rect() z f=True.

FrameBuffer.pixel(x: int, y: int, c: int | None = None) int | None

Bez argumentu c zwraca wartość koloru piksela w punkcie (x, y). Gdy podano c, ustawia ten piksel na kolor c.

FrameBuffer.hline(x: int, y: int, w: int, c: int) None
FrameBuffer.vline(x: int, y: int, h: int, c: int) None
FrameBuffer.line(x1: int, y1: int, x2: int, y2: int, c: int) None

Rysuje linię o grubości 1 piksela w kolorze c. hline() i vline() rysują poziomą/pionową linię o zadanej długości; line() rysuje linię między dwoma dowolnymi punktami.

FrameBuffer.rect(x: int, y: int, w: int, h: int, c: int, f: bool = False) None

Rysuje prostokąt w punkcie (x, y) o rozmiarze w x h w kolorze c. Jeśli f ma wartość True, prostokąt jest wypełniony; w przeciwnym razie rysowany jest tylko kontur o grubości 1 piksela.

FrameBuffer.ellipse(x: int, y: int, xr: int, yr: int, c: int, f: bool = False, m: int = 0) None

Rysuje elipsę o środku w punkcie (x, y) z promieniem w osi x xr i promieniem w osi y yr w kolorze c. Równe promienie dają okrąg. f=True wypełnia kształt zamiast jedynie go obrysowywać.

m to maska bitowa ograniczająca rysowanie do określonych ćwiartek (numerowanych przeciwnie do ruchu wskazówek zegara, zaczynając od prawej górnej):

Bit

Ćwiartka

Obszar

bit 0

Q1

Prawy górny

bit 1

Q2

Lewy górny

bit 2

Q3

Lewy dolny

bit 3

Q4

Prawy dolny

Domyślna wartość m=0 rysuje wszystkie cztery ćwiartki.

FrameBuffer.poly(x: int, y: int, coords: Any, c: int, f: bool = False) None

Rysuje dowolny zamknięty wielokąt (wypukły lub wklęsły) z przesunięciem (x, y) w kolorze c. coords musi być array 16-bitowych liczb całkowitych ze znakiem ułożonych jako array('h', [x0, y0, x1, y1, ..., xn, yn]). f=True wypełnia wielokąt zamiast jedynie go obrysowywać.

FrameBuffer.text(s: str, x: int, y: int, c: int = 1) None

Rysuje łańcuch s z jego lewym górnym narożnikiem w punkcie (x, y) w kolorze c. Wbudowana czcionka ma stały rozmiar 8x8 pikseli i nie można jej zmienić. c domyślnie ma wartość 1.

FrameBuffer.scroll(xstep: int, ystep: int) None

Przesuwa zawartość bufora o (xstep, ystep). Piksele wsuwane spoza bufora nie są czyszczone, więc na krawędzi spływu może pozostać „duch” poprzedniej zawartości.

FrameBuffer.blit(fbuf: FrameBuffer | Tuple, x: int, y: int, key: int = -1, palette: FrameBuffer | None = None) None

Rysuje inny bufor ramki fbuf na tym, z jego lewym górnym narożnikiem w punkcie (x, y).

Jeśli podano key, każdy piksel źródłowy pasujący do tej wartości koloru jest traktowany jako przezroczysty i nie jest rysowany. Gdy podano palette, porównanie odbywa się względem wyjścia palety, a nie surowej wartości fbuf.

fbuf może być instancją FrameBuffer lub krotką/listą pasującą do sygnatury konstruktora:

(buffer, width, height, format)
(buffer, width, height, format, stride)

Gdy źródłem jest krotka/lista, buffer może być tylko do odczytu.

palette umożliwia blitting między buforami o różnych formatach – na przykład renderowanie monochromatycznego glifu do bufora RGB565. Jest to FrameBuffer, którego format odpowiada celowi, o wysokości 1 i szerokości równej liczbie kolorów źródłowych (2**N dla źródła N bitów na piksel). Wartość piksela źródłowego i jest zastępowana kolorem palette[i, 0] przed rysowaniem.

Stałe

Następujące wartości format są akceptowane przez konstruktor. Kolumna „bajty na piksel” to mnożnik potrzebny przy określaniu rozmiaru bufora bazowego.

Stała

Bajty/piksel

Układ piksela

MONO_VLSB

0.125

Monochromatyczny (1-bitowy). Każdy bajt zawiera 8 ułożonych pionowo pikseli z bitem 0 najbliżej góry. Wiersze po 8 pikseli przesuwają się od lewej do prawej w buforze, a następnie zawijają do kolejnego 8-pikselowego wiersza.

MONO_HLSB

0.125

Monochromatyczny (1-bitowy). Każdy bajt zawiera 8 poziomych pikseli z bitem 7 najbardziej z lewej. Wiersze przesuwają się po jednym pikselu pionowo.

MONO_HMSB

0.125

Monochromatyczny (1-bitowy). Jak MONO_HLSB, ale z bitem 0 najbardziej z lewej.

GS2_HMSB

0.25

2-bitowa skala szarości (4 poziomy), pakowana poziomo, najbardziej znaczący bit jako pierwszy.

GS4_HMSB

0.5

4-bitowa skala szarości (16 poziomów), pakowana poziomo, najbardziej znaczący półbajt jako pierwszy.

GS8

1

8-bitowa skala szarości (256 poziomów).

RGB565

2

16-bitowy RGB z 5 bitami czerwieni, 6 bitami zieleni i 5 bitami błękitu.

framebuf.MVLSB jest przestarzałym aliasem dla framebuf.MONO_VLSB; w nowym kodzie preferuj ten drugi.

Konstruktor starszego typu

framebuf.FrameBuffer1(buffer: Any, width: int, height: int, stride: int | None = None, /) FrameBuffer

Przestarzały skrót dla FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride). Zachowany dla zgodności wstecznej; zamiast niego używaj pełnego konstruktora FrameBuffer.