цифровая электроника
вычислительная техника
встраиваемые системы

 
» » Переводим изображение в массив на C для передачи в USB-накопитель платы Arduino



Переводим изображение в массив на C для передачи в USB-накопитель платы Arduino

Автор: Mike(admin) от 21-04-2024, 23:55

Работа с выходными данными LCD, TFT, e-Ink или USB-C HDMI на Arduino перенесет вас в мир создания C-массивов для правильной подготовки кода изображения. Онлайн-инструменты конвертации станут отличным подспорьем для изображений и шрифтов.


Переводим изображение в массив на C для передачи в USB-накопитель платы Arduino

Одними из лучших онлайн-инструментов конвертации можно назвать File to CArray и Lvgl Font converter. Таким образом, для стандартных непрозрачных изображений это работает нормально, но как только вы переходите к прозрачным изображениям, используя такие функции, как STM32 ChromArt и функции DMA2D, вы предпочитаете вместо этого перейти к меньшему коду с поддержкой Alpha, например 16-битному ARGB1555, ARGB444, делая "перемещение спрайтов" возможным.


Другой вариант шрифтов уменьшенного размера – использовать шрифты A4 (4-битный альфа), где цвет заполняется функциями DMA2D. Это экономит много места для кода и сохраняет шрифты с функциями сглаживания.


Копаясь в мире цветовых форматов, вам нужно немного больше преобразований изображений, чем вы можете найти в Интернете, поэтому был написан этот инструмент для платы Arduino с поддержкой USB-накопителя: перетащите изображения на USB-накопитель, запустите код и получите преобразованный код C-массива. Вы можете создать свои собственные функции loop() для ваших личных требований. Код поддерживает изображения BMP и PNG (Alpha), а также поддерживает следующие типы цветов в качестве входных данных:



#define COLORMODE_ARGB8888        0x00000000U  /*!< цветовой режим ARGB8888 */
#define COLORMODE_RGB888          0x00000001U  /*!< цветовой режим RGB888   */
#define COLORMODE_RGB565          0x00000002U  /*!< цветовой режим RGB565   */
#define COLORMODE_ARGB1555        0x00000003U  /*!< цветовой режим ARGB1555 */
#define COLORMODE_ARGB4444        0x00000004U  /*!< цветовой режим ARGB4444 */ 
#define COLORMODE_ABGR8888        0x00000010U  /*!< цветовой режим ARGB8888 RB изменен */
#define COLORMODE_BGR888          0x00000011U  /*!< цветовой режим RGB888 RB изменен  */
#define COLORMODE_BGR565          0x00000012U  /*!< цветовой режим RGB565 RB изменен  */
#define COLORMODE_ABGR1555        0x00000013U  /*!< цветовой режим ARGB1555 RB изменен*/
#define COLORMODE_ABGR4444        0x00000014U  /*!< цветовой режим ARGB4444 RB изменен */
#define COLORMODE_XRGB8888        0x00000020U  /*!< цветовой режим ARGB8888 альфа игнорируется*/
#define COLORMODE_XRGB1555        0x00000023U  /*!< цветовой режим ARGB1555 альфа игнорируется*/
#define COLORMODE_XRGB4444        0x00000024U  /*!< цветовой режим ARGB4444 альфа игнорируется*/
#define COLORMODE_XBGR8888        0x00000030U  /*!< ARGB8888 альфа игнорируется RB изменен*/
#define COLORMODE_XBGR1555        0x00000033U  /*!< ABGR1555 альфа игнорируется RB изменен*/
#define COLORMODE_XBGR4444        0x00000034U  /*!< ABGR4444 альфа игнорируется RB изменен*/

Файлы преобразуются в следующие выходные данные:



#define COLORMODE_ARGB8888        0x00000000U  /*!< цветовой режим ARGB8888 */
#define COLORMODE_ARGB8888        0x00000000U  /*!< цветовой режим ARGB8888 */
#define COLORMODE_ARGB1555        0x00000003U  /*!< цветовой режим ARGB1555 */
#define COLORMODE_ARGB4444        0x00000004U  /*!< цветовой режим ARGB4444 */
#define COLORMODE_RGB565          0x00000002U  /*!< цветовой режим RGB565   */

Как правило, для непрозрачных изображений (без альфа-канала) вы используете BMP (32 или 16 бит) в качестве входных данных, для изображений на основе альфа-канала вы используете PNG (32-битный истинный цвет) в качестве входных данных.


Файлы PNG и BMP декодируются в один большой массив изображений в 32-битном формате. (uint32_t *IMAGERAW). Для этого требуется либо много оперативной памяти, либо SDRAM. В примере кода используется SDRAM платы PortentaH7, а максимальные размеры установлены на 480x320. Адаптируйте для правильного использования. После считывания в буфер изображения структура изображения h7image подготавливается со всеми необходимыми свойствами. эта структура используется для вызова функций преобразования.


Запись на USB-накопитель происходит медленно, небольшие файлы менее 64x64 занимают меньше секунды, а запись полных образов может занять до 10-20 сек.


Кроме того, инструмент поддерживает преобразование C-массива в C-массив, поэтому вы можете добавить свой c-массив в один из включаемых файлов (screen.h / screen.cpp) и вызвать функции для преобразования. Изображения настроены структурой h7image, которая объединяет все функции изображения для конвертации:



typedef struct {
void *imagearray;             /// указатель на массив
uint16_t width;               /// ширина
uint16_t height;              /// высота
uint32_t colormode;           /// Альфа-режимы : COLORMODE_ARGB1555 , COLORMODE_ARGB4444 ,COLORMODE_ARGB8888 // Фиксированные цветовые режимы :  COLORMODE_RGB565
uint8_t bpp;                  /// бит на пиксель => /8 байт на пиксель
uint16_t xpos;
uint16_t ypos;
char name[24];
char namea[24];             // имя массива в тексте -
char namesx[16];
char namesy[16];
} h7image;

Используя функцию DMS2D для STM32, можно понять, что цветовой режим A4 меняет местами верхний и нижний полубайты кода, сгенерированного LVGL. Функция преобразования FontA4 работает в том же типе преобразования массив-массив, и вы можете преобразовать A4 основанные шрифты до пригодной для использования версии. В результате преобразование осуществляется весьма просто.




© digitrode.ru


Теги: Arduino




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий