небольшой С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
Добавить комментарий