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(c: int) None

用颜色 c 填充整个帧缓冲区。

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

(x, y) 处用颜色 c 填充一个 w x h 的矩形。等同于 f=Truerect()

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) 处绘制一个大小为 w x h 的矩形,颜色为 c。如果 fTrue,则填充矩形;否则只绘制 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 值。“每像素字节数”列是确定后备缓冲区大小时所需的乘数。

常量

字节/像素

像素布局

MONO_VLSB

0.125

单色(1 位)。每个字节存放 8 个垂直堆叠的像素,第 0 位最靠近顶部。每 8 像素一行从左到右贯穿缓冲区,然后换到下一个 8 像素行。

MONO_HLSB

0.125

单色(1 位)。每个字节存放 8 个水平像素,第 7 位在最左侧。各行垂直方向每次推进一个像素。

MONO_HMSB

0.125

单色(1 位)。与 MONO_HLSB 类似,但第 0 位在最左侧。

GS2_HMSB

0.25

2 位灰度(4 级),水平打包,最高有效位在前。

GS4_HMSB

0.5

4 位灰度(16 级),水平打包,最高有效半字节在前。

GS8

1

8 位灰度(256 级)。

RGB565

2

16 位 RGB,红色 5 位、绿色 6 位、蓝色 5 位。

framebuf.MVLSBframebuf.MONO_VLSB 的已弃用别名;在新代码中应优先使用后者。

旧版构造函数

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

FrameBuffer(buffer, width, height, framebuf.MONO_VLSB, stride) 的已弃用快捷方式。为向后兼容而保留;请改用完整的 FrameBuffer 构造函数。