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 * heightpikseli w wybranymformat.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 wbuffer, jak i sposób interpretacji liczby całkowitej kolorucprzekazanej do dowolnej metody rysowania.stride– liczba pikseli w każdym poziomym wierszu, wliczając wszelkie wypełnienie. Domyślniewidth. Ustaw tę wartość, aby użyć podregionu większego bufora.
Przekazanie zbyt małego
bufferlub nieprawidłowych wymiarów spowoduje niezdefiniowane wyniki – konstruktor nie sprawdza każdej kombinacji.
Metody rysowania¶
- FrameBuffer.fill_rect(x: int, y: int, w: int, h: int, c: int) None¶
Wypełnia prostokąt
wxhw punkcie(x, y)koloremc. Równoważnerect()zf=True.
- FrameBuffer.pixel(x: int, y: int, c: int | None = None) int | None¶
Bez argumentu
czwraca wartość koloru piksela w punkcie(x, y). Gdy podanoc, ustawia ten piksel na kolorc.
- 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()ivline()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 rozmiarzewxhw kolorzec. Jeślifma 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 xxri promieniem w osi yyrw kolorzec. Równe promienie dają okrąg.f=Truewypełnia kształt zamiast jedynie go obrysowywać.mto 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=0rysuje 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 kolorzec.coordsmusi byćarray16-bitowych liczb całkowitych ze znakiem ułożonych jakoarray('h', [x0, y0, x1, y1, ..., xn, yn]).f=Truewypełnia wielokąt zamiast jedynie go obrysowywać.
- FrameBuffer.text(s: str, x: int, y: int, c: int = 1) None¶
Rysuje łańcuch
sz jego lewym górnym narożnikiem w punkcie(x, y)w kolorzec. Wbudowana czcionka ma stały rozmiar 8x8 pikseli i nie można jej zmienić.cdomyś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
fbufna 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 podanopalette, porównanie odbywa się względem wyjścia palety, a nie surowej wartościfbuf.fbufmoże być instancjąFrameBufferlub krotką/listą pasującą do sygnatury konstruktora:(buffer, width, height, format) (buffer, width, height, format, stride)
Gdy źródłem jest krotka/lista,
buffermoże być tylko do odczytu.paletteumożliwia blitting między buforami o różnych formatach – na przykład renderowanie monochromatycznego glifu do bufora RGB565. Jest toFrameBuffer, którego format odpowiada celowi, o wysokości 1 i szerokości równej liczbie kolorów źródłowych (2**Ndla źródła N bitów na piksel). Wartość piksela źródłowegoijest zastępowana kolorempalette[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 |
|---|---|---|
|
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. |
|
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. |
|
0.125 |
Monochromatyczny (1-bitowy). Jak |
|
0.25 |
2-bitowa skala szarości (4 poziomy), pakowana poziomo, najbardziej znaczący bit jako pierwszy. |
|
0.5 |
4-bitowa skala szarości (16 poziomów), pakowana poziomo, najbardziej znaczący półbajt jako pierwszy. |
|
1 |
8-bitowa skala szarości (256 poziomów). |
|
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 konstruktoraFrameBuffer.