framebuf — работа с буфером кадра

Модуль framebuf предоставляет небольшой пиксельный буфер без выделения памяти с примитивными операциями рисования. Он предназначен для управления внешними дисплеями (OLED, ЖК-дисплеями, электронной бумагой и т. д.).

Примечание

Для обработки изображений на захваченных кадрах используйте вместо него гораздо более богатый класс 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 — любой объект, поддерживающий протокол буфера; должен быть достаточно большим, чтобы вместить stride * height пикселей в выбранном формате format.

  • 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

Заполняет прямоугольник w x h в точке (x, y) цветом c. Эквивалентно rect() с f=True.

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

Рисует линию толщиной 1 пиксель цветом c. 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. Если 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 должен быть array знаковых 16-битных целых чисел, размещённых в виде array('h', [x0, y0, x1, y1, ..., xn, yn]). f=True заливает многоугольник вместо рисования только его контура.

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

Рисует строку s так, чтобы её верхний левый угол находился в точке (x, y), цветом c. Встроенный шрифт имеет фиксированный размер 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 и шириной, равной числу исходных цветов (2**N для источника с 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.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.