Що таке файл FLIF?
FLIF (Free Lossless Image Format) — це формат зображення без втрат, який використовує для файлів розширення .flif. FLIF стверджує, що перевершує PNG, WebP, BPG без втрат і JPEG 2000 без втрат за коефіцієнтом стиснення. FLIF використовує прогресивне чергування, завдяки чому будь-яке часткове завантаження зображення може використовуватися як кодування з втратами для всього зображення.
Коротка історія
FLIF був анонсований у вересні 2015 року, а альфа-версія була випущена в жовтні 2015 року. У вересні 2016 року була випущена перша стабільна версія FLIF.
Дизайн FLIF
FLIF використовує варіант CABAC (контекстно-адаптивне бінарне арифметичне кодування), MANIAC (метаадаптивне майже нульове цілочисельне арифметичне кодування) для стиснення. МАНІАК — це алгоритм ентропійного кодування, розроблений Джоном Снейерсом і Пітером Уіллем. У MANIAC контексти — це вузли дерев рішень, які динамічно вивчаються під час кодування. Це робить модель контексту більш специфічною для зображення та забезпечує краще стиснення. FLIF має наступні функції:
- Підтримує стиснення без втрат
- Підтримує стиснення з втратами з попередньою обробкою кодувальника
- Підтримує градації сірого, RGB і RGBA
- Підтримує глибину кольору від 1 до 16 біт на канал — Підтримує файли з черезрядковою розгорткою та без неї — Підтримує прогресивне декодування частково завантажених файлів
- Підтримує анімацію — Підтримує вбудовані профілі кольорів ICC, метадані Exif і XMP
- Має обмежену підтримку стиснення файлів Camera Raw (RGGB)
Формат файлу FLIF
Файл FLIF складається з чотирьох частин:
Основний заголовок
Головний заголовок містить основні метадані, включаючи ширину, висоту, глибину кольору, кількість кадрів.
Тип | Значення | Опис |
---|---|---|
4 байти | “FLIF” | Magic |
4 біти | 3 = ні; 4 = я все ще; 5 = ni anim; 6 = i anim | Чергування, анімація |
4 біти | 1 = градації сірого; 3 = RGB; 4 = RGBA | Кількість каналів (nb_channels) |
1 байт | ‘0’,‘1’,‘2’ (‘0’=власний) | Байт на канал (Bpc) |
varint | width-1 | Width |
варінт | висота-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 байт | NUL байт (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: повтор (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) | альфа-дільник | має_настроюване_відсічення_і_альфа | 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) | Прогноз невидимого пікселя | альфа_нуль && черезрядкова && діапазон альфа включає нуль |
Канали
Номер каналу | Опис |
---|---|
0 | Червоний або сірий |
1 | Зелений |
2 | Синій |
3 | Альфа |
Трансформації
Тип | Опис |
---|---|
uni_int(1) = 1 | Біт індикатора: ще не зроблено |
uni_int(0,13) | Ідентифікатор перетворення |
змінна | Дані перетворення (залежить від перетворення) |
Трансформація використовується для зміни даних пікселів для кращого стиснення та відстеження фактичних значень пікселів.
Піксельні дані
Ця частина містить фактичні піксельні дані, закодовані за допомогою ентропійного кодування MANIAC. Пікселі можуть бути закодовані за допомогою кодування через розгортку або без неї.
Переплетений метод
У цьому методі визначаються рівні масштабування. Рівень масштабування 0 використовується для повного зображення, рівень масштабування 1 використовується для всіх рядків з парними номерами, рівень масштабування 2 використовується для всіх стовпців з парними номерами рівня масштабування 1. Іншими словами, кожен рівень масштабування з парними номерами 2k є версією зі зниженою дискретизацією зображення в масштабі 1:2^k. Рівні масштабування кодуються від найвищого до найнижчого.
Метод без розгортки
У цьому методі відразу починається кодування дерев MANIAC, а потім кодування пікселів.