MicroPython:Библиотеки/framebuf: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} <syntaxhighlight lang="python" enclose="div"> =...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Модуль framebuf – манипуляции с кадровым буфером<ref>[http://docs.micropython.org/en/latest/library/framebuf.html docs.micropython.org - framebuf — frame buffer manipulation]</ref>= | |||
В этом модуле реализован стандартный кадровый буфер, который можно использовать для создания bitmap-изображений, которые затем можно отправлять на дисплей. | |||
== Класс «FrameBuffer» == | |||
Класс FrameBuffer предоставляет пиксельный буфер, из которого можно брать пиксели, линии, прямоугольники, текст и даже другие буферы FrameBuffer. Он используется для генерирования данных для отображения на экране. | |||
Например: | |||
<syntaxhighlight lang="python" enclose="div"> | <syntaxhighlight lang="python" enclose="div"> | ||
import framebuf | |||
# Объекту FrameBuffer нужно 2 байта для каждого RGB565-пикселя: | |||
fbuf = framebuf.FrameBuffer(bytearray(10 * 100 * 2), 10, 100, framebuf.RGB565) | |||
fbuf.fill(0) | |||
fbuf.text('MicroPython!', 0, 0, 0xffff) | |||
fbuf.hline(0, 10, 96, 0xffff) | |||
</syntaxhighlight> | |||
== Конструкторы == | |||
* Класс framebuf.FrameBuffer(buffer, width, height, format, stride=width, /) – конструирует объект FrameBuffer с помощью следующих аргументов: | |||
** buffer – объект с буферным протоколом, который должен быть достаточно большим, чтобы вместить в себя все пиксели, заданные шириной, высотой и форматом FrameBuffer. | |||
** width – ширина объекта FrameBuffer в пикселях. | |||
** height – высота объекта FrameBuffer в пикселях. | |||
** format – здесь задается тип пикселей, используемых в FrameBuffer. Допустимые значения для этого аргумента перечислены в разделе «Константы» ниже. В этом аргументе задается разрядность цветового формата и то, каким образом будет осуществляться раскладка битов в буфере buffer. Аргумент c в некоторых методах ниже – это малое целое, обозначающее нужный цвет. Какой именно цвет используется, будет зависеть от формата FrameBuffer. | |||
** stride – шаговое значение, обозначающее длину горизонтальной линии пикселей во FrameBuffer. По умолчанию здесь стоит width, но если у вас FrameBuffer находится внутри другого FrameBuffer или экрана, это значение, возможно, надо будет адаптировать. Если при адаптации значение будет увеличено, то буфер buffer должен быть достаточно велик, чтобы вместить в себя это увеличенное значение. | |||
Во всех эти аргументах (включая опциональный stride) должны быть заданы корректные значения. Если задать некорректный размер буфера или неправильное разрешение, это может привести к непредсказуемым ошибкам. | |||
== Рисование примитивных фигур == | |||
Методы ниже позволяют рисовать фигуры внутри FrameBuffer. | |||
* FrameBuffer.fill(c) – заполняет весь FrameBuffer заданным цветом. | |||
* FrameBuffer.pixel(x, y[, c]) – если аргумент c задан не будет, этот метод прочтет цветовое значение заданного пикселя. Если аргумент c будет задан, этот метод окрасит заданный пиксель в заданное цветовое значение. | |||
* FrameBuffer.hline(x, y, w, c), FrameBuffer.vline(x, y, h, c) и FrameBuffer.line(x1, y1, x2, y2, c) – рисует линию толщиной в 1 пиксель, используя заданные координаты и заданный цвет. Линия, рисуемая методом line(), заканчивается на второй паре координат, тогда как hline() и vline() просто рисуют горизонтальные и вертикальные линии заданной длины. | |||
* FrameBuffer.rect(x, y, w, h, c) и FrameBuffer.fill_rect(x, y, w, h, c) – рисуют прямоугольник заданного размера и цвета на заданном месте. Метод rect() рисует только 1-пиксельный контур, тогда как fill_rect() рисует и контур, и внутреннюю часть прямоугольника. | |||
== Рисование текста == | |||
* FrameBuffer.text(s, x, y[, c]) – рисует текст в FrameBuffer при помощи координат, которые играют роль верхнего левого угла текстового блока. Цвет текста можно задать с помощью опционального аргумента c, но если он задан не будет, автоматически будет использовано значение «1». Все символы имеют размер 8х8 пикселей, и в данный момент возможности поменять шрифт, к сожалению, нет. | |||
== Другие методы == | |||
* FrameBuffer.scroll(xstep, ystep) – смещает содержимое FrameBuffer по заданному вектору. Это может оставить в FrameBuffer отпечаток предыдущих цветов. | |||
* FrameBuffer.blit(fbuf, x, y[, key]) – рисует поверх текущего FrameBuffer еще один FrameBuffer, используя заданные координаты. Значение в аргументе key – это целое число, обозначающее цвет, который будет считаться прозрачным: система просто не будет рисовать пиксели этого цвета. | |||
Этот метод работает с экземплярами FrameBuffer, использующими разные форматы, но итоговые цвета могут получиться не такими, как планировалось, из-за несоответствия цветовых форматов. | |||
== Константы == | |||
* framebuf.MONO_VLSB – монохромный (1-битный) цветовой формат. В этом случае биты байта будут расположены вертикально, а 0-вой бит будет находиться в самой верхней части экрана. Соответственно, каждый байт будет занимать 8 вертикальных пикселей. Последующие байты будут располагаться правее – пока не достигнут самой правой части экрана. Следующая полоса байтов будет рендериться, начиная с самой левой части экрана, но на 8 пикселей ниже, и снова – до самой правой части экрана. И по такому принципу дальше будут рендериться все остальные пиксели. | |||
* framebuf.MONO_HLSB – монохромный (1-битный) цветовой формат. В этом случае пиксели будут рендериться горизонтально. Каждый байт будет занимать 8 горизонтальных пикселей, из которых левее всех будет находиться 7-ой бит. Все последующие байты будут рендериться на последующих горизонтальных локациях – пока не будет достигнута самая правая часть экрана. Следующие байты будут рендериться в следующем ряду – на один пиксель ниже. | |||
* framebuf.MONO_HMSB – монохромный (1-битный) цветовой формат. В этом режиме пиксели будут рендериться горизонтально. Каждый байт будет занимать 8 горизонтальных пикселей, из которых левее всех будет находиться 0-ой бит. Все последующие байты будут рендериться на последующих горизонтальных локациях – пока не будет достигнута самая правая часть экрана. Следующие байты будут рендериться в следующем ряду – на один пиксель ниже. | |||
* framebuf.RGB565 – RGB-формат (от англ. «Red, Green, Blue», что значит «красный, зеленый, синий»). 16-бит, 5+6+5. | |||
* framebuf.GS2_HMSB – 2-битный цветовой формат с разными градациями серого цвета. | |||
* framebuf.GS4_HMSB – 4-битный цветовой формат с разными градациями серого цвета. | |||
* framebuf.GS8 – 8-битный цветовой формат с разными градациями серого цвета. | |||
=См.также= | =См.также= |
Версия от 20:03, 2 сентября 2020
Модуль framebuf – манипуляции с кадровым буфером[1]
В этом модуле реализован стандартный кадровый буфер, который можно использовать для создания bitmap-изображений, которые затем можно отправлять на дисплей.
Класс «FrameBuffer»
Класс FrameBuffer предоставляет пиксельный буфер, из которого можно брать пиксели, линии, прямоугольники, текст и даже другие буферы FrameBuffer. Он используется для генерирования данных для отображения на экране.
Например:
import framebuf
# Объекту FrameBuffer нужно 2 байта для каждого RGB565-пикселя:
fbuf = framebuf.FrameBuffer(bytearray(10 * 100 * 2), 10, 100, framebuf.RGB565)
fbuf.fill(0)
fbuf.text('MicroPython!', 0, 0, 0xffff)
fbuf.hline(0, 10, 96, 0xffff)
Конструкторы
- Класс framebuf.FrameBuffer(buffer, width, height, format, stride=width, /) – конструирует объект FrameBuffer с помощью следующих аргументов:
- buffer – объект с буферным протоколом, который должен быть достаточно большим, чтобы вместить в себя все пиксели, заданные шириной, высотой и форматом FrameBuffer.
- width – ширина объекта FrameBuffer в пикселях.
- height – высота объекта FrameBuffer в пикселях.
- format – здесь задается тип пикселей, используемых в FrameBuffer. Допустимые значения для этого аргумента перечислены в разделе «Константы» ниже. В этом аргументе задается разрядность цветового формата и то, каким образом будет осуществляться раскладка битов в буфере buffer. Аргумент c в некоторых методах ниже – это малое целое, обозначающее нужный цвет. Какой именно цвет используется, будет зависеть от формата FrameBuffer.
- stride – шаговое значение, обозначающее длину горизонтальной линии пикселей во FrameBuffer. По умолчанию здесь стоит width, но если у вас FrameBuffer находится внутри другого FrameBuffer или экрана, это значение, возможно, надо будет адаптировать. Если при адаптации значение будет увеличено, то буфер buffer должен быть достаточно велик, чтобы вместить в себя это увеличенное значение.
Во всех эти аргументах (включая опциональный stride) должны быть заданы корректные значения. Если задать некорректный размер буфера или неправильное разрешение, это может привести к непредсказуемым ошибкам.
Рисование примитивных фигур
Методы ниже позволяют рисовать фигуры внутри FrameBuffer.
- FrameBuffer.fill(c) – заполняет весь FrameBuffer заданным цветом.
- FrameBuffer.pixel(x, y[, c]) – если аргумент c задан не будет, этот метод прочтет цветовое значение заданного пикселя. Если аргумент c будет задан, этот метод окрасит заданный пиксель в заданное цветовое значение.
- FrameBuffer.hline(x, y, w, c), FrameBuffer.vline(x, y, h, c) и FrameBuffer.line(x1, y1, x2, y2, c) – рисует линию толщиной в 1 пиксель, используя заданные координаты и заданный цвет. Линия, рисуемая методом line(), заканчивается на второй паре координат, тогда как hline() и vline() просто рисуют горизонтальные и вертикальные линии заданной длины.
- FrameBuffer.rect(x, y, w, h, c) и FrameBuffer.fill_rect(x, y, w, h, c) – рисуют прямоугольник заданного размера и цвета на заданном месте. Метод rect() рисует только 1-пиксельный контур, тогда как fill_rect() рисует и контур, и внутреннюю часть прямоугольника.
Рисование текста
- FrameBuffer.text(s, x, y[, c]) – рисует текст в FrameBuffer при помощи координат, которые играют роль верхнего левого угла текстового блока. Цвет текста можно задать с помощью опционального аргумента c, но если он задан не будет, автоматически будет использовано значение «1». Все символы имеют размер 8х8 пикселей, и в данный момент возможности поменять шрифт, к сожалению, нет.
Другие методы
- FrameBuffer.scroll(xstep, ystep) – смещает содержимое FrameBuffer по заданному вектору. Это может оставить в FrameBuffer отпечаток предыдущих цветов.
- FrameBuffer.blit(fbuf, x, y[, key]) – рисует поверх текущего FrameBuffer еще один FrameBuffer, используя заданные координаты. Значение в аргументе key – это целое число, обозначающее цвет, который будет считаться прозрачным: система просто не будет рисовать пиксели этого цвета.
Этот метод работает с экземплярами FrameBuffer, использующими разные форматы, но итоговые цвета могут получиться не такими, как планировалось, из-за несоответствия цветовых форматов.
Константы
- framebuf.MONO_VLSB – монохромный (1-битный) цветовой формат. В этом случае биты байта будут расположены вертикально, а 0-вой бит будет находиться в самой верхней части экрана. Соответственно, каждый байт будет занимать 8 вертикальных пикселей. Последующие байты будут располагаться правее – пока не достигнут самой правой части экрана. Следующая полоса байтов будет рендериться, начиная с самой левой части экрана, но на 8 пикселей ниже, и снова – до самой правой части экрана. И по такому принципу дальше будут рендериться все остальные пиксели.
- framebuf.MONO_HLSB – монохромный (1-битный) цветовой формат. В этом случае пиксели будут рендериться горизонтально. Каждый байт будет занимать 8 горизонтальных пикселей, из которых левее всех будет находиться 7-ой бит. Все последующие байты будут рендериться на последующих горизонтальных локациях – пока не будет достигнута самая правая часть экрана. Следующие байты будут рендериться в следующем ряду – на один пиксель ниже.
- framebuf.MONO_HMSB – монохромный (1-битный) цветовой формат. В этом режиме пиксели будут рендериться горизонтально. Каждый байт будет занимать 8 горизонтальных пикселей, из которых левее всех будет находиться 0-ой бит. Все последующие байты будут рендериться на последующих горизонтальных локациях – пока не будет достигнута самая правая часть экрана. Следующие байты будут рендериться в следующем ряду – на один пиксель ниже.
- framebuf.RGB565 – RGB-формат (от англ. «Red, Green, Blue», что значит «красный, зеленый, синий»). 16-бит, 5+6+5.
- framebuf.GS2_HMSB – 2-битный цветовой формат с разными градациями серого цвета.
- framebuf.GS4_HMSB – 4-битный цветовой формат с разными градациями серого цвета.
- framebuf.GS8 – 8-битный цветовой формат с разными градациями серого цвета.