Какво е FLIF файл?
FLIF (Free Lossless Image Format) е формат на изображение без загуби, който използва разширението .flif за своите файлове. FLIF твърди, че превъзхожда PNG, WebP, BPG без загуби и JPEG 2000 без загуби по отношение на степента на компресия. FLIF използва прогресивно преплитане, поради което всяко частично изтегляне на изображението може да се използва като кодиране със загуби за цялото изображение.
Кратка история
FLIF беше обявен през септември 2015 г., а алфа версията беше пусната през октомври 2015 г. През септември 2016 г. беше пусната първата стабилна версия на FLIF.
FLIF дизайн
FLIF използва вариант на CABAC (контекстно-адаптивно двоично аритметично кодиране), MANIAC (мета-адаптивно почти нулево целочислено аритметично кодиране) за компресиране. MANIAC е алгоритъм за ентропийно кодиране, разработен от Jon Sneyers и Pieter Wuille. В MANIAC контекстите са възли на дървета на решения, които се научават динамично по време на кодиране. Това прави контекстния модел по-специфичен за изображението и води до по-добра компресия. FLIF има следните характеристики:
- Поддържа компресия без загуби
- Поддържа компресия със загуби с предварителна обработка на енкодер
- Поддържа сива скала, RGB и RGBA
- Поддържа дълбочина на цвета от 1 до 16 бита на канал
- Поддържа презредови и непреплетени файлове
- Поддържа прогресивно декодиране на частично изтеглени файлове
- Поддържа анимации
- Поддържа вградени ICC цветови профили, Exif и XMP метаданни
- Има ограничена поддръжка за компресиране на необработени файлове на камерата (RGGB)
FLIF файлов формат
FLIF файлът има следните четири части:
Главен колонтитул
Основният хедър съдържа основните метаданни, включително ширина, височина, дълбочина на цвета, брой кадри.
Тип | Стойност | Описание |
---|---|---|
4 байта | “FLIF” | Magic |
4 бита | 3 = ni неподвижно; 4 = аз все още; 5 = ni anim; 6 = i anim | Преплитане, анимация |
4 бита | 1 = Нива на сивото; 3 = RGB; 4 = RGBA | Брой канали (nb_канали) |
1 байт | ‘0’,‘1’,‘2’ (‘0’=персонализиран) | Байтове на канал (Bpc) |
varint | width-1 | Width |
varint | height-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’: повторение(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) | Закъснение на кадър в ms | nb_frames > 1: повторение(nb_frames) | |
uni_int(0,1) | Флаг: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | срязване | има_персонализирано_срязване_и_алфа | 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. Пикселите могат да бъдат кодирани с помощта на презредово или непреплетено кодиране.
Преплетен метод
При този метод се дефинират нива на мащабиране. Zoomlevel 0 се използва за цялото изображение, zoomlevel 1 се използва за всички четни редове, zoomlevel 2 се използва за всички четни колони от zoomlevel 1. С други думи, всяко четно ниво на мащабиране 2k е намалена версия на изображение, в мащаб 1:2^k. Нивата на мащабиране са кодирани от най-високото към най-ниското.
Метод без преплитане
При този метод кодирането на дърветата MANIAC започва веднага последвано от кодирането на пикселите.