Formát souboru FLIF
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ů.