framebuf --- thao tác với bộ đệm khung hình

Mô-đun framebuf cung cấp một bộ đệm điểm ảnh nhỏ gọn, không cấp phát thêm bộ nhớ, với các thao tác vẽ cơ bản. Mô-đun được thiết kế để điều khiển các màn hình ngoài (OLED, LCD, e-paper, v.v.).

Ghi chú

Để xử lý ảnh từ các khung hình đã chụp, hãy dùng lớp image.Image phong phú hơn của OpenMV -- lớp này cung cấp nhiều hàm vẽ, chuyển đổi màu sắc và tính năng phân tích hơn nhiều so với 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.

Ví dụ:

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)

Hàm khởi tạo

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

Khởi tạo đối tượng FrameBuffer.

  • buffer -- bất kỳ đối tượng nào hỗ trợ giao thức bộ đệm; phải đủ lớn để chứa stride * height điểm ảnh với format đã chọn.

  • width -- chiều rộng của bộ đệm khung hình tính theo điểm ảnh.

  • height -- chiều cao của bộ đệm khung hình tính theo điểm ảnh.

  • format -- định dạng điểm ảnh; một trong các hằng số được liệt kê tại Hằng số bên dưới. Định dạng xác định cả kích thước mỗi điểm ảnh trong buffer và cách số nguyên màu sắc c truyền vào bất kỳ phương thức vẽ nào được diễn giải.

  • stride -- số điểm ảnh mỗi hàng ngang, kể cả phần đệm. Mặc định là width. Đặt giá trị này để sử dụng một vùng con của bộ đệm lớn hơn.

Truyền buffer quá nhỏ, hoặc kích thước không hợp lệ, sẽ tạo ra kết quả không xác định -- hàm khởi tạo không kiểm tra mọi tổ hợp.

Phương thức vẽ

FrameBuffer.fill(c: int) None

Tô toàn bộ bộ đệm khung hình bằng màu sắc c.

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

Tô hình chữ nhật kích thước w x h tại (x, y) bằng màu sắc c. Tương đương với rect() với f=True.

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

Khi không có đối số c, trả về giá trị màu sắc của điểm ảnh tại (x, y). Khi có c, đặt điểm ảnh đó thành màu sắc 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

Vẽ một đường thẳng dày 1 điểm ảnh với màu sắc c. hline()vline() vẽ đường ngang/dọc với chiều dài cho trước; line() vẽ đường thẳng giữa hai điểm tùy ý.

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

Vẽ hình chữ nhật tại (x, y) có kích thước w x h với màu sắc c. Nếu fTrue thì hình chữ nhật được tô đầy; ngược lại chỉ vẽ đường viền dày 1 điểm ảnh.

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

Vẽ hình elip có tâm tại (x, y) với bán kính x là xr và bán kính y là yr với màu sắc c. Khi hai bán kính bằng nhau thì tạo thành hình tròn. f=True tô đầy hình thay vì chỉ vẽ đường viền.

m là mặt nạ bit giới hạn việc vẽ trong các góc phần tư cụ thể (được đánh số ngược chiều kim đồng hồ từ góc trên-phải):

Bit

Góc phần tư

Vùng

bit 0

Q1

Trên-phải

bit 1

Q2

Trên-trái

bit 2

Q3

Dưới-trái

bit 3

Q4

Dưới-phải

Giá trị mặc định m=0 vẽ tất cả bốn góc phần tư.

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

Vẽ một đa giác khép kín tùy ý (lồi hoặc lõm) tại offset (x, y) với màu sắc c. coords phải là một array gồm các số nguyên có dấu 16-bit được sắp xếp theo dạng array('h', [x0, y0, x1, y1, ..., xn, yn]). f=True tô đầy đa giác thay vì chỉ vẽ đường viền.

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

Vẽ chuỗi s với góc trên-trái tại (x, y) bằng màu sắc c. Font tích hợp cố định ở 8x8 điểm ảnh và không thể thay đổi. c mặc định là 1.

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

Dịch chuyển nội dung bộ đệm theo (xstep, ystep). Các điểm ảnh được dịch vào từ bên ngoài bộ đệm không được xóa, do đó có thể còn "bóng ma" của nội dung trước tại cạnh sau.

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

Vẽ bộ đệm khung hình fbuf khác lên trên bộ đệm này với góc trên-trái tại (x, y).

Nếu key được chỉ định, bất kỳ điểm ảnh nguồn nào khớp với giá trị màu sắc đó sẽ được coi là trong suốt và không được vẽ. Khi có palette, phép so sánh được thực hiện trên đầu ra palette, không phải giá trị thô fbuf.

fbuf có thể là một thực thể FrameBuffer hoặc một tuple/list khớp với chữ ký hàm khởi tạo:

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

Khi nguồn là tuple/list, buffer có thể chỉ đọc.

palette cho phép blit giữa các bộ đệm có định dạng khác nhau -- ví dụ, vẽ một glyph đơn sắc vào bộ đệm RGB565. Đây là một FrameBuffer có định dạng khớp với đích, cao 1 và rộng bằng số màu sắc nguồn (2**N cho nguồn N-bit-mỗi-pixel). Giá trị điểm ảnh nguồn i được thay thế bằng màu sắc tại palette[i, 0] trước khi vẽ.

Hằng số

Các giá trị format sau được chấp nhận bởi hàm khởi tạo. Cột "byte mỗi điểm ảnh" là hệ số nhân cần thiết khi tính kích thước bộ đệm nền.

Hằng số

Byte/điểm ảnh

Bố cục điểm ảnh

MONO_VLSB

0.125

Đơn sắc (1-bit). Mỗi byte chứa 8 điểm ảnh xếp dọc với bit 0 gần đỉnh nhất. Các hàng 8 điểm ảnh tiến từ trái sang phải qua bộ đệm, rồi xuống hàng 8 điểm ảnh tiếp theo.

MONO_HLSB

0.125

Đơn sắc (1-bit). Mỗi byte chứa 8 điểm ảnh ngang với bit 7 bên trái nhất. Các hàng tiến từng điểm ảnh theo chiều dọc.

MONO_HMSB

0.125

Đơn sắc (1-bit). Giống MONO_HLSB nhưng với bit 0 bên trái nhất.

GS2_HMSB

0.25

Thang xám 2-bit (4 mức), được đóng gói ngang với bit có trọng số cao nhất trước.

GS4_HMSB

0.5

Thang xám 4-bit (16 mức), được đóng gói ngang với nibble có trọng số cao nhất trước.

GS8

1

Thang xám 8-bit (256 mức).

RGB565

2

RGB 16-bit với 5 bit đỏ, 6 bit xanh lá và 5 bit xanh lam.

framebuf.MVLSB là bí danh đã lỗi thời của framebuf.MONO_VLSB; hãy dùng tên sau trong mã mới.

Hàm khởi tạo kế thừa

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

Phím tắt đã lỗi thời cho FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride). Được giữ lại để tương thích ngược; hãy dùng hàm khởi tạo đầy đủ FrameBuffer thay thế.