framebuf --- 帧缓冲区操作¶
framebuf 模块提供了一个小型的、无需分配内存的像素缓冲区,并带有基本的绘制操作。它适用于驱动外部显示屏(OLED、LCD、电子纸等)。
备注
对于在捕获的帧上进行图像处理的工作,请改用 OpenMV 功能更丰富的 image.Image 类——它提供的绘制基元、颜色转换和分析功能远多于 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.
示例::
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)
构造函数¶
- class framebuf.FrameBuffer(buffer: Any, width: int, height: int, format: int, stride: int | None = None, /)¶
构造一个
FrameBuffer对象。buffer—— 任何支持缓冲协议的对象;必须足够大,能够以所选的format容纳stride * height个像素。width—— 帧缓冲区的宽度(以像素为单位)。height—— 帧缓冲区的高度(以像素为单位)。format—— 像素格式;为下文 常量 中列出的常量之一。该格式既决定buffer中每个像素的大小,也决定如何解释传递给任何绘制方法的颜色整数c。stride—— 每个水平行的像素数,包括任何填充。默认为width。将其设置为使用更大缓冲区的一个子区域。
传入过小的
buffer或无效的尺寸会产生未定义的结果——构造函数并不会校验每一种组合。
绘制方法¶
- FrameBuffer.fill_rect(x: int, y: int, w: int, h: int, c: int) None¶
在
(x, y)处用颜色c填充一个wxh的矩形。等同于f=True的rect()。
- FrameBuffer.pixel(x: int, y: int, c: int | None = None) int | None¶
若不带
c参数,则返回(x, y)处像素的颜色值。若给出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¶
用颜色
c绘制一条 1 像素粗的线。hline()和vline()绘制给定长度的水平/垂直线;line()在两个任意点之间绘制一条线。
- FrameBuffer.rect(x: int, y: int, w: int, h: int, c: int, f: bool = False) None¶
在
(x, y)处绘制一个大小为wxh的矩形,颜色为c。如果f为True,则填充矩形;否则只绘制 1 像素的轮廓。
- FrameBuffer.ellipse(x: int, y: int, xr: int, yr: int, c: int, f: bool = False, m: int = 0) None¶
绘制一个以
(x, y)为中心、x 半径为xr、y 半径为yr的椭圆,颜色为c。半径相等时绘制出圆形。f=True填充该形状,而非仅绘制轮廓。m是一个位掩码,用于将绘制限制在特定象限(从右上角开始按逆时针编号):位
象限
区域
第 0 位
Q1
右上
第 1 位
Q2
左上
第 2 位
Q3
左下
第 3 位
Q4
右下
默认的
m=0绘制全部四个象限。
- FrameBuffer.poly(x: int, y: int, coords: Any, c: int, f: bool = False) None¶
在偏移
(x, y)处用颜色c绘制一个任意的闭合多边形(凸或凹)。coords必须是一个由有符号 16 位整数组成的array,按array('h', [x0, y0, x1, y1, ..., xn, yn])的形式排布。f=True填充多边形,而非仅绘制轮廓。
- FrameBuffer.text(s: str, x: int, y: int, c: int = 1) None¶
在
(x, y)处以左上角为起点用颜色c绘制字符串s。内置字体固定为 8x8 像素且无法更改。c默认为1。
- FrameBuffer.scroll(xstep: int, ystep: int) None¶
将缓冲区内容按
(xstep, ystep)移动。从缓冲区外部移入的像素不会被清除,因此在拖尾边缘可能会残留先前内容的“鬼影”。
- FrameBuffer.blit(fbuf: FrameBuffer | Tuple, x: int, y: int, key: int = -1, palette: FrameBuffer | None = None) None¶
在本帧缓冲区之上绘制另一个帧缓冲区
fbuf,其左上角位于(x, y)。如果给出
key,则任何与该颜色值匹配的源像素都会被视为透明而不予绘制。当提供palette时,比较将针对调色板的输出进行,而非原始的fbuf值。fbuf可以是一个FrameBuffer实例,也可以是匹配构造函数签名的元组/列表::(buffer, width, height, format) (buffer, width, height, format, stride)
当源为元组/列表时,
buffer可以是只读的。palette允许在不同格式的缓冲区之间进行位块传输——例如,将一个单色字形渲染到 RGB565 缓冲区中。它是一个FrameBuffer,其格式与目标相匹配,高度为 1,宽度等于源颜色的数量(对于每像素 N 位的源为2**N)。源像素值i在绘制前会被替换为palette[i, 0]处的颜色。
常量¶
构造函数接受以下 format 值。“每像素字节数”列是确定后备缓冲区大小时所需的乘数。
常量 |
字节/像素 |
像素布局 |
|---|---|---|
|
0.125 |
单色(1 位)。每个字节存放 8 个垂直堆叠的像素,第 0 位最靠近顶部。每 8 像素一行从左到右贯穿缓冲区,然后换到下一个 8 像素行。 |
|
0.125 |
单色(1 位)。每个字节存放 8 个水平像素,第 7 位在最左侧。各行垂直方向每次推进一个像素。 |
|
0.125 |
单色(1 位)。与 |
|
0.25 |
2 位灰度(4 级),水平打包,最高有效位在前。 |
|
0.5 |
4 位灰度(16 级),水平打包,最高有效半字节在前。 |
|
1 |
8 位灰度(256 级)。 |
|
2 |
16 位 RGB,红色 5 位、绿色 6 位、蓝色 5 位。 |
framebuf.MVLSB 是 framebuf.MONO_VLSB 的已弃用别名;在新代码中应优先使用后者。
旧版构造函数¶
- framebuf.FrameBuffer1(buffer: Any, width: int, height: int, stride: int | None = None, /) FrameBuffer¶
FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride)的已弃用快捷方式。为向后兼容而保留;请改用完整的FrameBuffer构造函数。