framebuf --- manipulasi buffer bingkai

Modul framebuf menyediakan buffer piksel kecil bebas-alokasi dengan operasi gambar primitif. Modul ini ditujukan untuk mengendalikan tampilan eksternal (OLED, LCD, e-paper, dll.).

Catatan

Untuk pekerjaan pemrosesan citra pada bingkai yang ditangkap, gunakan kelas image.Image OpenMV yang jauh lebih kaya -- kelas ini menawarkan jauh lebih banyak primitif gambar, konversi warna, dan fitur analisis dibandingkan 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.

Contoh:

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)

Konstruktor

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

Membuat objek FrameBuffer.

  • buffer -- objek apa pun yang mendukung protokol buffer; harus cukup besar untuk menampung piksel stride * height pada format yang dipilih.

  • width -- lebar buffer bingkai dalam piksel.

  • height -- tinggi buffer bingkai dalam piksel.

  • format -- format piksel; salah satu konstanta yang tercantum di Konstanta di bawah. Format menentukan ukuran setiap piksel dalam buffer dan bagaimana bilangan bulat warna c yang diteruskan ke metode gambar apa pun diinterpretasikan.

  • stride -- jumlah piksel per baris horizontal, termasuk padding apa pun. Defaultnya adalah width. Setel ini untuk menggunakan sub-wilayah buffer yang lebih besar.

Meneruskan buffer yang terlalu kecil, atau dimensi yang tidak valid, akan menghasilkan hasil yang tidak terdefinisi -- konstruktor tidak memvalidasi setiap kombinasi.

Metode gambar

FrameBuffer.fill(c: int) None

Isi seluruh buffer bingkai dengan warna c.

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

Isi persegi panjang w x h pada (x, y) dengan warna c. Setara dengan rect() dengan f=True.

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

Tanpa argumen c, kembalikan nilai warna piksel pada (x, y). Dengan c diberikan, setel piksel tersebut ke warna 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

Gambar garis setebal 1 piksel dalam warna c. hline() dan vline() menggambar garis horizontal/vertikal dengan panjang yang diberikan; line() menggambar garis antara dua titik sembarang.

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

Gambar persegi panjang pada (x, y) berukuran w x h dalam warna c. Jika f adalah True persegi panjang diisi; jika tidak hanya garis luar 1 piksel yang digambar.

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

Gambar elips yang berpusat pada (x, y) dengan jari-jari x xr dan jari-jari y yr dalam warna c. Jari-jari yang sama menghasilkan lingkaran. f=True mengisi bentuk alih-alih hanya menggariskannya.

m adalah bitmask yang membatasi gambar ke kuadran tertentu (diberi nomor berlawanan arah jarum jam dari kanan atas):

Bit

Kuadran

Wilayah

bit 0

Q1

Kanan atas

bit 1

Q2

Kiri atas

bit 2

Q3

Kiri bawah

bit 3

Q4

Kanan bawah

Default m=0 menggambar semua empat kuadran.

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

Gambar poligon tertutup sembarang (cembung atau cekung) pada offset (x, y) dalam warna c. coords harus berupa array dari bilangan bulat 16-bit bertanda yang ditata sebagai array('h', [x0, y0, x1, y1, ..., xn, yn]). f=True mengisi poligon alih-alih hanya menggariskannya.

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

Gambar string s dengan pojok kiri atasnya pada (x, y) dalam warna c. Font bawaan ditetapkan pada 8x8 piksel dan tidak dapat diubah. c defaultnya adalah 1.

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

Geser isi buffer sebesar (xstep, ystep). Piksel yang digeser dari luar buffer tidak dibersihkan, sehingga "bayangan" dari isi sebelumnya mungkin tetap ada di tepi belakang.

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

Gambar buffer bingkai lain fbuf di atas yang ini dengan pojok kiri atasnya pada (x, y).

Jika key diberikan, piksel sumber mana pun yang cocok dengan nilai warna tersebut diperlakukan sebagai transparan dan tidak digambar. Ketika palette disediakan, perbandingan dibuat terhadap output palette, bukan nilai fbuf mentah.

fbuf dapat berupa instans FrameBuffer atau tuple/list yang cocok dengan tanda tangan konstruktor:

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

Ketika sumbernya adalah tuple/list, buffer dapat bersifat read-only.

palette memungkinkan blitting antara buffer dengan format berbeda -- misalnya, merender glyph monokrom ke dalam buffer RGB565. Ini adalah FrameBuffer yang formatnya cocok dengan tujuan, dengan tinggi 1 dan lebar sama dengan jumlah warna sumber (2**N untuk sumber N-bit-per-piksel). Nilai piksel sumber i digantikan dengan warna pada palette[i, 0] sebelum digambar.

Konstanta

Nilai format berikut diterima oleh konstruktor. Kolom "byte per piksel" adalah pengali yang dibutuhkan saat menentukan ukuran buffer backing.

Konstanta

Byte/piksel

Tata letak piksel

MONO_VLSB

0.125

Monokrom (1-bit). Setiap byte menampung 8 piksel yang ditumpuk secara vertikal dengan bit 0 paling dekat dengan atas. Baris dari 8 piksel melanjutkan kiri-ke-kanan melintasi buffer, kemudian membungkus ke baris 8 piksel berikutnya.

MONO_HLSB

0.125

Monokrom (1-bit). Setiap byte menampung 8 piksel horizontal dengan bit 7 paling kiri. Baris melanjutkan satu piksel sekaligus secara vertikal.

MONO_HMSB

0.125

Monokrom (1-bit). Seperti MONO_HLSB tetapi dengan bit 0 paling kiri.

GS2_HMSB

0.25

Skala abu-abu 2-bit (4 level), dikemas secara horizontal dengan bit paling signifikan terlebih dahulu.

GS4_HMSB

0.5

Skala abu-abu 4-bit (16 level), dikemas secara horizontal dengan nibble paling signifikan terlebih dahulu.

GS8

1

Skala abu-abu 8-bit (256 level).

RGB565

2

RGB 16-bit dengan 5 bit merah, 6 bit hijau, dan 5 bit biru.

framebuf.MVLSB adalah alias yang sudah usang untuk framebuf.MONO_VLSB; lebih suka gunakan yang terakhir dalam kode baru.

Konstruktor lama

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

Pintasan yang sudah usang untuk FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride). Dipertahankan untuk kompatibilitas mundur; gunakan konstruktor FrameBuffer lengkap sebagai gantinya.