.FLIF вариант №
FLIF (Free Lossless Image Format) — это формат изображения без потерь, который использует расширение .flif для своих файлов. FLIF утверждает, что превосходит PNG, без потерь WebP, BPG без потерь и JPEG 2000 без потерь с точки зрения коэффициента сжатия. FLIF использует прогрессивное чередование, благодаря чему любая частичная загрузка изображения может быть использована как кодирование с потерями для всего изображения.
Краткая история
FLIF был анонсирован в сентябре 2015 года, а альфа-версия была выпущена в октябре 2015 года. В сентябре 2016 года была выпущена первая стабильная версия FLIF.
ФЛИФ Дизайн
FLIF использует вариант CABAC (контекстно-адаптивное двоичное арифметическое кодирование), MANIAC (метаадаптивное целочисленное арифметическое кодирование, близкое к нулю) для сжатия. MANIAC — это алгоритм энтропийного кодирования, разработанный Джоном Снейерсом и Питером Вуилле. В MANIAC контексты — это узлы деревьев решений, которые динамически изучаются во время кодирования. Это делает контекстную модель более специфичной для изображения и приводит к лучшему сжатию. FLIF имеет следующие особенности:
- Поддерживает сжатие без потерь
- Поддерживает сжатие с потерями с предварительной обработкой кодировщика
- Поддерживает оттенки серого, RGB и RGBA
- Поддерживает глубину цвета от 1 до 16 бит на канал
- Поддерживает чересстрочные и не чересстрочные файлы
- Поддерживает прогрессивное декодирование частично загруженных файлов
- Поддерживает анимацию
- Поддерживает встроенные цветовые профили ICC, метаданные Exif и XMP.
- Имеет ограниченную поддержку сжатия необработанных файлов камеры (RGGB).
Формат файла FLIF
Файл FLIF состоит из следующих четырех частей:
Основной заголовок
Основной заголовок содержит основные метаданные, включая ширину, высоту, глубину цвета, количество кадров.
Тип | Значение | Описание |
---|---|---|
4 байта | “FLIF” | Магия |
4 бита | 3 = ni еще; 4 = я все еще; 5 = ни аним; 6 = я аним | Чересстрочная развертка, анимация |
4 бита | 1 = оттенки серого; 3 = RGB; 4 = RGBA | Количество каналов (nb_channels) |
1 байт | ‘0’,‘1’,‘2’ (‘0’=пользовательский) | Байт на канал (бит/канал) |
варинт | ширина-1 | Ширина |
варинт | высота-1 | Высота |
varint | nb_frames-2 (только если анимация) | Количество кадров (nb_frames) |
Фрагменты метаданных
Эта часть содержит непиксельные данные, такие как метаданные Exif/XMP, цветовой профиль ICC и т. д., закодированные с использованием сжатия DEFLATE. Эти фрагменты определяются аналогично фрагментам PNG с той разницей, что размер фрагмента кодируется переменным числом байтов. Имена чанков могут состоять из 4 букв (4 байта) или иметь значение меньше 32, указывающее на необязательный чанк.
Ниже приведен пример дополнительных патронов:
Имя чанка | Описание | Содержимое (после DEFLATE-распаковки) |
---|---|---|
iCCP | Цветовой профиль ICC | необработанные данные цветового профиля ICC |
eXif | Метаданные Exif | Заголовок “Exif\0\0”, за которым следует заголовок TIFF и данные EXIF |
eXmp | Метаданные XMP | XMP, содержащиеся в xpacket только для чтения без заполнения |
Соглашение об именовании
- Первая буква: прописные буквы используются для критических фрагментов, а строчные — для некритических фрагментов.
- Вторая буква: прописные буквы используются для общедоступных фрагментов, а строчные — для частных.
- Третья буква: прописные буквы используются для меток, которые необходимы для правильного отображения изображения, а строчные буквы не важны для отображения изображения.
- Четвертая буква: Прописные буквы используются для патронов, которые можно безопасно копировать вслепую. Патроны нижнего регистра зависят от данных изображения.
Второй заголовок
Он содержит информацию о фактическом кодировании пикселей.
Тип | Описание | Условие | Значение по умолчанию |
---|---|---|---|
1 байт | Нулевой байт (0x00), имя блока битового потока FLIF16 | ||
uni_int(1,16) | Бит на пиксель каналов | Bpc == ‘0’: repeat(nb_channels) | 8, если Bpc == ‘1’, 16, если Bpc == ‘2’ |
uni_int(0,1) | Флаг: alpha_zero | nb_channels > 3 | 0 |
uni_int(0,100) | Количество циклов | nb_frames > 1 | |
uni_int(0,60_000) | Задержка кадра в мс | nb_frames > 1: repeat(nb_frames) | |
uni_int(0,1) | Флаг: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | cutoff | has_custom_cutoff_and_alpha | 2 |
uni_int(2,128) | альфа-делитель | has_custom_cutoff_and_alpha | 19 |
uni_int(0,1) | Флаг: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 |
? | Bitchance | has_custom_bitchance | |
переменная | Преобразования (см. ниже) | ||
uni_int(1) = 0 | Бит индикатора: преобразование завершено | ||
uni_int(0,2) | Предсказатель невидимых пикселей | alpha_zero && чересстрочная развертка && Альфа-диапазон включает ноль |
Каналы
Номер канала | Описание |
---|---|
0 | Красный или серый |
1 | Зеленый |
2 | Синий |
3 | Альфа |
Преобразования
Тип | Описание |
---|---|
uni_int(1) = 1 | Бит индикатора: еще не выполнено |
uni_int(0,13) | Идентификатор преобразования |
переменная | Данные преобразования (зависит от преобразования) |
Преобразование используется для изменения данных пикселей для лучшего сжатия и отслеживания фактических значений пикселей.
Пиксельные данные
Эта часть содержит фактические данные пикселей, закодированные с использованием энтропийного кодирования MANIAC. Пиксели могут быть закодированы с использованием чересстрочного или нечересстрочного кодирования.
Чересстрочный метод
В этом методе определяются уровни масштабирования. Уровень масштабирования 0 используется для полного изображения, уровень масштабирования 1 используется для всех строк с четными номерами, уровень масштабирования 2 используется для всех четных столбцов уровня масштабирования 1. Другими словами, каждый уровень масштабирования с четным номером 2k является уменьшенной версией изображение в масштабе 1:2^k. Уровни масштабирования кодируются от самого высокого к самому низкому.
Нечересстрочный метод
В этом методе кодирование деревьев MANIAC начинается сразу же после кодирования пикселей.