Co je soubor FLIF?
FLIF (Free Lossless Image Format) je bezztrátový formát obrázků, který pro své soubory používá příponu .flif. FLIF tvrdí, že překonává PNG, bezztrátové WebP, bezztrátové BPG a bezztrátové JPEG 2000 z hlediska kompresního poměru. FLIF používá progresivní prokládání, díky kterému lze jakékoli částečné stažení obrázku použít jako ztrátové kódování pro celý obrázek.
Stručná historie
FLIF byl oznámen v září 2015 a alfa verze byla vydána v říjnu 2015. V září 2016 byla vydána první stabilní verze FLIF.
Design FLIF
FLIF používá pro kompresi variantu CABAC (Kontextově adaptivní binární aritmetické kódování), MANIAC (Meta-Adaptivní Near-zero Integer Arithmetic Coding). MANIAC je entropický kódovací algoritmus vyvinutý Jonem Sneyersem a Pieterem Wuillem. V MANIAC jsou kontexty uzly rozhodovacích stromů, které se dynamicky učí v době kódování. Díky tomu je kontextový model více specifický pro obrázky a výsledkem je lepší komprese. FLIF má následující vlastnosti:
- Podporuje bezeztrátovou kompresi
- Podporuje ztrátovou kompresi s předzpracováním kodéru
- Podporuje stupně šedi, RGB a RGBA
- Podporuje barevnou hloubku 1 až 16 bitů na kanál
- Podporuje prokládané a neprokládané soubory
- Podporuje progresivní dekódování částečně stažených souborů
- Podporuje animace
- Podporuje vložené profily barev ICC, metadata Exif a XMP
- Má omezenou podporu pro kompresi souborů camera raw (RGGB)
Formát souboru FLIF
Soubor FLIF má následující čtyři části:
Hlavní záhlaví
Hlavní záhlaví obsahuje hlavní metadata včetně šířky, výšky, barevné hloubky, počtu snímků.
Typ | Hodnota | Popis |
---|---|---|
4 bajty | “FLIF” | Kouzlo |
4 bity | 3 = ni stále; 4 = i stále; 5 = ni anim; 6 = i anim | Prokládání, animace |
4 bity | 1 = stupně šedi; 3 = RGB; 4 = RGBA | Počet kanálů (nb_channels) |
1 bajt | ‘0’,‘1’,‘2’ (‘0’=vlastní) | Bajty na kanál (Bpc) |
varint | šířka-1 | šířka |
varint | výška-1 | Výška |
varint | nb_frames-2 (pouze v případě animace) | Počet snímků (nb_frames) |
Části metadat
Tato část obsahuje nepixelová metadata, jako jsou Exif/XMP metadata, barevný profil ICC atd., která jsou kódována pomocí komprese DEFLATE. Tyto bloky jsou definovány podobně jako bloky PNG s tím rozdílem, že velikost sklíčidla je kódována proměnným počtem bajtů. Názvy bloků mohou mít 4 písmena (4 bajty) nebo hodnotu nižší než 32 označující nepovinný blok.
Následuje příklad volitelných sklíčidel:
Název bloku | Popis | Obsah (po dekompresi DEFLATE) |
---|---|---|
iCCP | profil barev ICC | surová data barevného profilu ICC |
eXif | Exif metadata | “Exif\0\0” hlavička následovaná hlavičkou TIFF a EXIF data |
eXmp | XMP metadata | XMP obsažená v xpacketu pouze pro čtení bez odsazení |
Konvence pojmenování
- První písmeno: Velká písmena se používají pro kritické a malá písmena pro nekritické části.
- Druhé písmeno: Velká písmena se používají pro veřejné a malá písmena pro soukromé části
- Třetí písmeno: Velká písmena se používají pro sklíčidla, která jsou potřebná pro správné zobrazení obrázku a malá písmena nejsou pro zobrazení obrázku důležitá.
- Čtvrté písmeno: Velká písmena se používají pro sklíčidla, která lze bezpečně kopírovat naslepo. Sklíčidla s malými písmeny závisí na obrazových datech.
Druhé záhlaví
To obsahuje informace týkající se skutečného kódování pixelů.
Typ | Popis | Podmínka | Výchozí hodnota |
---|---|---|---|
1 byte | bajt NUL (0x00), název bloku bitového toku FLIF16 | ||
uni_int(1,16) | Bity na pixel kanálů | Bpc == ‘0’: repeat(nb_channels) | 8, pokud Bpc == ‘1’, 16, pokud Bpc == ‘2’ |
uni_int(0,1) | Příznak: alpha_zero | nb_channels > 3 | 0 |
uni_int(0,100) | Počet smyček | nb_frames > 1 | |
uni_int(0,60_000) | Zpoždění snímků v ms | nb_frames > 1: repeat(nb_frames) | |
uni_int(0,1) | Příznak: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | cutoff | has_custom_cutoff_and_alpha | 2 |
uni_int(2,128) | dělitel alfa | has_custom_cutoff_and_alpha | 19 |
uni_int(0,1) | Příznak: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 |
? | Bitchance | has_custom_bitchance | |
proměnná | Transformace (viz níže) | ||
uni_int(1) = 0 | Indikační bit: hotovo s transformacemi | ||
uni_int(0,2) | Prediktor neviditelných pixelů | alpha_zero && prokládaný && rozsah alfa zahrnuje nulu |
Kanály
Číslo kanálu | Popis |
---|---|
0 | Červená nebo šedá |
1 | Zelená |
2 | Modrá |
3 | Alfa |
Proměny
Typ | Popis |
---|---|
uni_int(1) = 1 | Indikační bit: ještě není hotovo |
uni_int(0,13) | Identifikátor transformace |
proměnná | Data transformace (závisí na transformaci) |
Transformace se používá k úpravě dat pixelů pro lepší kompresi a ke sledování skutečně se vyskytujících hodnot pixelů.
Pixelová data
Tato část obsahuje aktuální pixelová data zakódovaná pomocí kódování entropie MANIAC. Pixely mohou být kódovány pomocí prokládaného nebo neprokládaného kódování.
Prokládaná metoda
V této metodě jsou definovány úrovně přiblížení. Úroveň přiblížení 0 se používá pro celý obrázek, úroveň přiblížení 1 se používá pro všechny sudé řádky, úroveň přiblížení 2 se používá pro všechny sloupce úrovně přiblížení 1. Jinými slovy, každá úroveň přiblížení se sudým číslem 2k je převzorkovaná verze obrázek v měřítku 1:2^k. Úrovně přiblížení jsou kódovány od nejvyšší po nejnižší.
Neprokládaná metoda
V této metodě začíná kódování stromů MANIAC bezprostředně následované kódováním pixelů.