небольшой С99 кодек encoder GIF gifenc

Кодировщика GIF

Это небольшой С99 библиотека, которая может быть использована для создания GIF анимации.

Особенности

  • пользовательские палитры любой глубины от 1 до 8
  • каждый кадр имеет свое (заданное пользователем) время задержки
  • гибкие варианты перекручивания: нет петли, Н повторений, бесконечный цикл
  • Гиф оптимизация Размер: только хранит различия рамы
  • оперативную память: сохранение кадров в файл как можно скорее
  • компактный и портативный: менее 300 строк С99

Ограничения

  • нет кадров-локальных палитр (несовместима с оптимизацией размера)
  • не чересстрочная

Документация

Есть только три функции, объявленные в "gifenc.h": new_gif(), add_frame() и close_gif().

В new_gif (функции) получает GIF глобальные параметры и возвращает обработчик GIF:

GIF *new_gif(
    const char *fname,                  /* GIF file name */
    uint16_t width, uint16_t height,    /* frame size */
    uint8_t *palette, int depth,        /* color table */
    int loop                            /* looping information */
);

Этот palette параметр должен указывать на массив данных о цвете. Каждая запись представляет собой 24-бит цвет RGB, хранящиеся в трех смежных байта: первый-это красный (0-255), затем зеленый, затем синий. Записи хранятся в виде непрерывного массива байтов.

Этот depth параметр указывает, сколько цветов присутствуют в данном палитра. Количество цветов в массиве палитры должно быть 2^depth, где (1 <= depth <= 8) (2^depth)=1,2,4,8,16,32,64,128,256.

Пример palette и depth значения:

uint8_t palette[] = {
    0x00, 0x00, 0x00,   /* entry 0: black */
    0xFF, 0xFF, 0xFF,   /* entry 1: white */
    0xFF, 0x00, 0x00,   /* entry 2: red */
    0x00, 0x00, 0xFF,   /* entry 3: blue */
};
int depth = 2;          /* palette has 1 << 2 (i.e. 4) entries */

Если palette имеет значение NULL, записи берутся из умолчанию Таблица из 256 цветов. Если depth < 8, таблицы по умолчанию будет обрезан до подходящего размера. В таблица по умолчанию состоит из 16 стандартных цветах VGA, плюс 216 веб-просмотра цвета (все комбинации RGB с только 6 допустимые значения для каждого канала), плюс 24 серого цвета на равном расстоянии между черным и белым, кроме как.

Если loop параметр равен нулю, в результате гиф будет бесконечный цикл. Если это положительное число, анимация будет воспроизводиться, что количество раз. Если loop отрицательно, нет зацикливания информация хранится в файле GIF (для большинства гиф зрители, это эквивалентно loop == 1, т. е. "играть").

В add_frame() функция считывает пиксельные данные из буфера и сохраняет полученный кадр в файл, связанный с указанным обработчиком гиф:

void add_frame(GIF *gif, uint16_t delay);

Этот delay параметр определяет, сколько времени кадр будет показываться, в hundreths секунды. Например, delay == 100 означает "показать этот кадр на одну секунду" и delay == 25 означает: "покажи этот кадр уже четверть второго". Обратите внимание, что короткие задержки могут не поддерживаться некоторые GIF зрителей: рекомендуется держать минимум delay == 6. Если delay == 0, без задержки информация будет храниться для каркаса. Это может быть использовано при создании еще (одного кадра) изображения в формате GIF.

Пиксельные данные считываются из gif->frame, который указывает на блок памяти такой:

uint8_t _frame_[gif->width * gif->height];

Обратите внимание, что адрес gif->frame меняется между вызовами add_frame() (*). По этой причине, каждый кадр должен быть написан в полном объеме в текущем адрес, даже если кто-то хочет только изменить несколько пикселей из последнего кадра. В шифратор автоматически определит разницу между двумя последовательными кадрами для того, чтобы уменьшить размер выходного.

Каждый байт в буфер кадра пикселей. Значение каждого пиксела является индекс для элемента палитры. Например, приведенный выше пример палитры, мы можем создать кадр с красным-на-черном "Ф" письмо как это:

uint8_t pixels[] = {
    2, 2, 2, 2,
    2, 0, 0, 0,
    2, 0, 0, 0,
    2, 2, 2, 0,
    2, 0, 0, 0,
    2, 0, 0, 0,
    2, 0, 0, 0
};
GIF *gif = new_gif("F.gif", 4, 7, palette, depth, loop);
memcpy(gif->frame, pixels, sizeof(pixels));
add_frame(gif, 0);
close_gif(gif);

Функция close_gif() завершает написание гиф данные в файл, связанный с данный гиф ручки и памяти очистки. Эта функция должна вызываться один раз после того, как все нужные кадры были добавлены, чтобы правильно сохранить в формате GIF файл. После вызова этой функции, обработчик GIF не может быть больше использована.

void close_gif(GIF* gif);

(*) Энкодер держит два буфера кадров внутри организации в целях реализации оптимизация размера. Адрес gif->frame чередуется между этими двумя буфера после каждого вызова add_frame().

Пример

Смотрите пример файла".с". Это можно проверить так:

$ чч -o пример gifenc.с пример.с $ ./пример

Это должно создать GIF по имени "example.gif".

Копирование

Весь исходный код и документация для gifenc выпущен в открытом доступе и предоставляется без каких-либо гарантий.

Добавить комментарий

Обратная связь

Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях

пишите мне на netdm@mail.ru