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

27 января 2026

Наконец-то я написал полноценный онлайн‑конвертер 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.

Обычные не анимированные картинки так же можно конвертировать