framebuf — маніпуляції з кадровим буфером

Модуль framebuf надає невеликий піксельний буфер без виділення пам’яті з примітивними операціями малювання. Призначений для керування зовнішніми дисплеями (OLED, LCD, e-paper тощо).

Примітка

Для обробки зображень на захоплених кадрах використовуйте значно багатший клас image.Image OpenMV — він пропонує набагато більше примітивів малювання, перетворень кольорів та функцій аналізу, ніж 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 — бітова маска, що обмежує малювання певними квадрантами (нумеруються проти годинникової стрілки від верхнього правого):

Біт

Квадрант

Область

bit 0

Q1

Верхній правий

bit 1

Q2

Верхній лівий

bit 2

Q3

Нижній лівий

bit 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.