framebuf — manipulação de frame buffer¶
O módulo framebuf fornece um pequeno buffer de pixels sem alocação, com operações primitivas de desenho. Ele é destinado ao controle de displays externos (OLEDs, LCDs, e-paper, etc.).
Nota
Para trabalho de processamento de imagem em quadros capturados, use a classe image.Image da OpenMV, muito mais rica – ela oferece muito mais primitivas de desenho, conversões de cor e recursos de análise do que 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.
Exemplo:
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)
Construtores¶
- class framebuf.FrameBuffer(buffer: Any, width: int, height: int, format: int, stride: int | None = None, /)¶
Constrói um objeto
FrameBuffer.buffer– qualquer objeto que suporte o protocolo de buffer; deve ser grande o suficiente para conterstride * heightpixels noformatescolhido.width– largura do frame buffer em pixels.height– altura do frame buffer em pixels.format– formato de pixel; uma das constantes listadas em Constantes abaixo. O formato determina tanto o tamanho de cada pixel embufferquanto como um inteiro de corcpassado a qualquer método de desenho é interpretado.stride– número de pixels por linha horizontal, incluindo qualquer preenchimento. Temwidthcomo valor padrão. Defina isso para usar uma sub-região de um buffer maior.
Passar um
bufferpequeno demais, ou dimensões inválidas, produzirá resultados indefinidos – o construtor não valida todas as combinações.
Métodos de desenho¶
- FrameBuffer.fill_rect(x: int, y: int, w: int, h: int, c: int) None¶
Preenche um retângulo
wxhem(x, y)com a corc. Equivalente arect()comf=True.
- FrameBuffer.pixel(x: int, y: int, c: int | None = None) int | None¶
Sem o argumento
c, retorna o valor de cor do pixel em(x, y). Comcinformado, define esse pixel para a corc.
- 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¶
Desenha uma linha de 1 pixel de espessura na cor
c.hline()evline()desenham uma linha horizontal/vertical do comprimento informado;line()desenha uma linha entre dois pontos arbitrários.
- FrameBuffer.rect(x: int, y: int, w: int, h: int, c: int, f: bool = False) None¶
Desenha um retângulo em
(x, y)de tamanhowxhna corc. SefforTrue, o retângulo é preenchido; caso contrário, apenas um contorno de 1 pixel é desenhado.
- FrameBuffer.ellipse(x: int, y: int, xr: int, yr: int, c: int, f: bool = False, m: int = 0) None¶
Desenha uma elipse centrada em
(x, y)com raio em xxre raio em yyrna corc. Raios iguais produzem um círculo.f=Truepreenche a forma em vez de apenas contorná-la.mé uma máscara de bits que restringe o desenho a quadrantes específicos (numerados no sentido anti-horário a partir do superior direito):Bit
Quadrante
Região
bit 0
Q1
Superior direito
bit 1
Q2
Superior esquerdo
bit 2
Q3
Inferior esquerdo
bit 3
Q4
Inferior direito
O padrão
m=0desenha todos os quatro quadrantes.
- FrameBuffer.poly(x: int, y: int, coords: Any, c: int, f: bool = False) None¶
Desenha um polígono fechado arbitrário (convexo ou côncavo) no offset
(x, y)na corc.coordsdeve ser umarrayde inteiros de 16 bits com sinal, dispostos comoarray('h', [x0, y0, x1, y1, ..., xn, yn]).f=Truepreenche o polígono em vez de apenas contorná-lo.
- FrameBuffer.text(s: str, x: int, y: int, c: int = 1) None¶
Desenha a string
scom seu canto superior esquerdo em(x, y)na corc. A fonte embutida é fixa em 8x8 pixels e não pode ser alterada.ctem1como valor padrão.
- FrameBuffer.scroll(xstep: int, ystep: int) None¶
Desloca o conteúdo do buffer em
(xstep, ystep). Os pixels que entram a partir de fora do buffer não são limpos, de modo que um “fantasma” do conteúdo anterior pode permanecer na borda final.
- FrameBuffer.blit(fbuf: FrameBuffer | Tuple, x: int, y: int, key: int = -1, palette: FrameBuffer | None = None) None¶
Desenha outro frame buffer
fbufsobre este, com seu canto superior esquerdo em(x, y).Se
keyfor informado, qualquer pixel de origem que corresponda a esse valor de cor é tratado como transparente e não é desenhado. Quando umapaletteé fornecida, a comparação é feita em relação à saída da paleta, não ao valor bruto defbuf.fbufpode ser uma instância deFrameBufferou uma tupla/lista correspondente à assinatura do construtor:(buffer, width, height, format) (buffer, width, height, format, stride)
Quando a origem é uma tupla/lista,
bufferpode ser somente leitura.palettepermite o blitting entre buffers de formatos diferentes – por exemplo, renderizar um glifo monocromático em um buffer RGB565. É umFrameBuffercujo formato corresponde ao destino, com altura 1 e largura igual ao número de cores da origem (2**Npara uma origem de N bits por pixel). O valor de pixel de origemié substituído pela cor empalette[i, 0]antes do desenho.
Constantes¶
Os seguintes valores de format são aceitos pelo construtor. A coluna “bytes por pixel” é o multiplicador necessário ao dimensionar o buffer de apoio.
Constante |
Bytes/pixel |
Layout de pixel |
|---|---|---|
|
0.125 |
Monocromático (1 bit). Cada byte armazena 8 pixels empilhados verticalmente, com o bit 0 mais próximo do topo. Linhas de 8 pixels avançam da esquerda para a direita pelo buffer e então passam para a próxima linha de 8 pixels. |
|
0.125 |
Monocromático (1 bit). Cada byte armazena 8 pixels horizontais, com o bit 7 mais à esquerda. As linhas avançam um pixel por vez verticalmente. |
|
0.125 |
Monocromático (1 bit). Como |
|
0.25 |
Escala de cinza de 2 bits (4 níveis), empacotada horizontalmente com o bit mais significativo primeiro. |
|
0.5 |
Escala de cinza de 4 bits (16 níveis), empacotada horizontalmente com o nibble mais significativo primeiro. |
|
1 |
Escala de cinza de 8 bits (256 níveis). |
|
2 |
RGB de 16 bits com 5 bits de vermelho, 6 de verde e 5 de azul. |
framebuf.MVLSB é um alias obsoleto de framebuf.MONO_VLSB; prefira o segundo em código novo.
Construtor legado¶
- framebuf.FrameBuffer1(buffer: Any, width: int, height: int, stride: int | None = None, /) FrameBuffer¶
Atalho obsoleto para
FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride). Mantido por compatibilidade retroativa; use o construtor completoFrameBufferem vez dele.