Онлайн конвертер gif анимации в C/C++ код

Наконец-то я написал полноценный онлайн‑конвертер GIF анимаций для черно-белых дисплеев, который позволяет всего за несколько кликов превратить обычную GIF‑ку в готовый заголовочный файл C/C++. Никаких сложных программ и ручной обработки — всё делается прямо в браузере.
Первая попытка написать GIF‑конвертер была в 2021 году. Тогда я собирал метеостанцию, которая получала данные с weather.com и, помимо текстовой информации, должна была отображать анимацию текущей погоды. Для этого я сделал простой конвертер, в котором анимацию приходилось преобразовывать в полуавтоматическом режиме. На канале есть видео об этом способе (его можно посмотреть по ссылке). К сожалению, полноценное видео о работе метеостанции не сохранилось — остались лишь отдельные фрагменты, снятые на телефон, которые можно увидеть в приложенном здесь ролике.
Конвертер GIF2Cpp
Принцип работы максимально простой: вы загружаете GIF‑анимацию, а на выходе получаете заголовочный файл с расширением .h. Внутри него уже находится готовый код всех кадров анимации, а также автоматически сформированный массив указателей на эти кадры. Такой файл можно сразу подключить к вашему проекту и использовать без дополнительной обработки.
Конвертер преобразует анимацию в чёрно‑белый формат с использованием алгоритма дизеринга Floyd–Steinberg. Благодаря этому изображение выглядит более «живым» и имитирует полутона на монохромном дисплее. В настройках доступны регулировка яркости и контрастности, что позволяет добиться максимально качественного результата. Можно задать итоговый размер изображения и сразу увидеть, как анимация будет выглядеть на черно-белом дисплее. Также доступна возможность инверсии кадров анимации и изменение формата байта: по умолчанию используется старший бит первым, но его можно галочкой переключить на младший.

Онлайн инструмент был создан для упрощения работы с анимацией в Arduino‑проектах для микроконтроллеров ESP, STM и Atmega. Ранее преобразование GIF‑анимации требовало использования нескольких программ, ручного разбиения на кадры и написания массива указателей для их воспроизведения. Это занимало много времени. Теперь этот процесс занимает всего несколько минут и не требует специальных знаний. Даже если вы только начинаете знакомство с программированием и микроконтроллерами Ардуино, вы сможете без труда добавить анимацию в свой проект.
Базовый скетч
Для работы этого скетча нужно установить библиотеку U8g2. Компиляцию скетча проверял в Arduino IDE 2.3.6 и в 2.3.7, в других более старых версиях не пробовал.
Разрешение экрана в коде предустановлено для OLED‑дисплея(72x40), интегрированного в плату ESP32‑C3. При использовании других дисплеев необходимо изменить соответствующие настройки.
В коде используется функция animatoin_view(), предназначенная для воспроизведения анимации.
Описание animatoin_view():
- anim_widht - размер gif по горизонтали
- anim_height - размер gif по вертикали
- animdelay - длительность показа кадра в мс
- anim_frame - количество кадров анимации
- anim_repeat - количество повторных показов анимации
- anim_n - массив указателей
Нажмите, что бы посмотреть
#include "gif_anim.h"
#define OLED_SDA 5 // дисплей подключен к пинам 5 и 6
#define OLED_SCL 6 // к шине i2c ESP32C3
#define width 72 // разрешение по горизонтали
#define height 40 // разрешение по вертикали
#define bright 255 // яркость дисплея
#define x_Offset ((128-width)/2) //стартовая позиция экрана по оси X
#define y_Offset (64-height) //стартовая позиция экрана по оси Y
#define anim_delay 70 // длительность отображения кадра
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, OLED_SCL, OLED_SDA); // инициализация
void setup(void)
{
u8g2.begin();
u8g2.setBusClock(400000); // Выбираем частоту шины 400kHz I2C
u8g2.setContrast(bright); // Устанавливаем яркость на максимум
}
void loop(void)
{
animatoin_view(GIF_ANIM_WIDTH, GIF_ANIM_HEIGHT, anim_delay, GIF_ANIM_COUNT, 1, gif_anim);
}
void animatoin_view(uint8_t anim_widht, uint8_t anim_height, uint16_t animdelay, uint16_t anim_frame, uint8_t anim_repeat, const uint8_t * const anim_n[] )
{
for( uint8_t j = 0; j<anim_repeat; j++)
{
for( uint8_t i = 0; i<anim_frame; i++)
{
u8g2.drawXBMP(x_Offset+(width-anim_widht)/2, y_Offset+(height-anim_height)/2, anim_widht, anim_height, anim_n[i]); // загрузить указанный кадр анимации в дисплей
u8g2.sendBuffer(); // отобразить на экране дисплея
delay(animdelay); // задержка между кадрами
}
}
u8g2.clearBuffer(); // очищаем буфер
u8g2.clearDisplay(); // очищаем экран
}
Для работы скетча создайте в конвертере анимацию с именем gif_anim.h и сохраните файл в папке со скетчем. После этого перезапустите Arduino IDE — код будет готов к прошивке в микроконтроллер. Этого достаточно для запуска любой сгенерированной вами анимации.
Важно учитывать, что анимация большого размера может не поместиться в память микроконтроллера Arduino. Размер анимации можно оценить, умножив количество кадров на размер одного кадра в байтах.
Корпус для микроконтроллера

Скачать 3D модель корпуса для ESP32C3-OLED
Вывод
Конвертер анимации создан, чтобы сделать работу с графикой максимально простой и удобной.
В видео вы увидите весь процесс конвертации — от исходного файла до готового .h‑файла, готового к использованию в проекте.
Конвертер полностью бесплатный и доступен каждому для личного использования.
Почему я выбрал именно чёрно-белые дисплеи?
В отличие от цветных, они не требуют больших объемов памяти. А это критично, ведь объём памяти в микроконтроллерах ограничен — не подключать же еще и флешку к проекту, когда можно обойтись и без неё?
Если у вас остались вопросы, то задавайте их в комментариях
P.S.
Обычные не анимированные картинки так же можно конвертировать
0 комментариев