Mi az a FLIF fájl?
A FLIF (Free Lossless Image Format) egy veszteségmentes képformátum, amely a .flif kiterjesztést használja a fájlokhoz. A FLIF azt állítja, hogy a tömörítési arány tekintetében felülmúlja a PNG, a veszteségmentes WebP, a veszteségmentes BPG-t és a veszteségmentes JPEG 2000-et. A FLIF progresszív átlapolást használ, aminek köszönhetően a kép bármely részleges letöltése veszteséges kódolásként használható a teljes képhez.
Rövid története
A FLIF-et 2015 szeptemberében jelentették be, az alfa verziót pedig 2015 októberében adták ki. 2016 szeptemberében adták ki a FLIF első stabil verzióját.
FLIF Design
A FLIF a CABAC (kontextushoz alkalmazkodó bináris aritmetikai kódolás), a MANIAC (Meta-Adaptive Near-zero Integer Aithmetic Coding) egy változatát használja a tömörítéshez. A MANIAC egy entrópiakódoló algoritmus, amelyet Jon Sneyers és Pieter Wuille fejlesztett ki. A MANIAC-ban a kontextusok a döntési fák csomópontjai, amelyeket a kódolási időben dinamikusan tanulnak meg. Ez a kontextusmodellt képspecifikusabbá teszi, és jobb tömörítést eredményez. A FLIF a következő funkciókkal rendelkezik:
- Támogatja a veszteségmentes tömörítést
 - Támogatja a veszteséges tömörítést kódoló előfeldolgozással
 - Támogatja a szürkeárnyalatot, az RGB-t és az RGBA-t
 - Támogatja a csatornánként 1-16 bites színmélységet
 - Támogatja a váltottsoros és nem váltott soros fájlokat
 - Támogatja a részben letöltött fájlok progresszív dekódolását
 - Támogatja az animációkat
 - Támogatja a beágyazott ICC színprofilokat, az Exif és XMP metaadatokat
 - Korlátozottan támogatja a nyers kamerafájlok tömörítését (RGGB)
 
FLIF fájlformátum
A FLIF fájl a következő négy részből áll:
Fő fejléc
A fő fejléc tartalmazza a fő metaadatokat, beleértve a szélességet, magasságot, színmélységet és a keretek számát.
| Típus | Érték | Leírás | 
|---|---|---|
| 4 bájt | “FLIF” | Magic | 
| 4 bit | 3 = ni még; 4 = i még; 5 = ni anim; 6 = i anim | Váltottsorolás, animáció | 
| 4 bit | 1 = szürkeárnyalatos; 3 = RGB; 4 = RGBA | Csatornák száma (nb_channels) | 
| 1 bájt | ‘0’,‘1’,‘2’ (‘0’=egyéni) | Bájt csatornánként (Bpc) | 
| varint | szélesség-1 | Szélesség | 
| varint | magasság-1 | Magasság | 
| varint | nb_frames-2 (csak animáció esetén) | Képek száma (nb_frames) | 
Metaadat-darabok
Ez a rész nem pixeles, például Exif/XMP metaadatokat, ICC színprofilt stb. tartalmaz, amelyek DEFLATE tömörítéssel vannak kódolva. Ezek a darabok a PNG-darabokhoz hasonlóan vannak definiálva, azzal a különbséggel, hogy a tokmány mérete változó számú bájttal van kódolva. A darabok neve 4 betűből (4 bájtból) vagy 32 alatti értékből állhat, ami nem kötelező darabot jelez.
A következő példa az opcionális tokmányokra:
| Részlet neve | Leírás | Tartalom (DEFLATE-dekompresszió után) | 
|---|---|---|
| iCCP | ICC színprofil | nyers ICC színprofil adatok | 
| eXif | Exif metadata | “Exif\0\0” fejléc, majd egy TIFF-fejléc és az EXIF-adatok | 
| eXmp | XMP-metaadatok | Az XMP egy csak olvasható xpacketben található, kitöltés nélkül | 
Elnevezési
- Első betű: A nagybetűket a kritikus, a kisbetűket pedig a nem kritikus darabokhoz használják.
 - Második betű: A nagybetűket a nyilvános, a kisbetűket pedig a privát darabokhoz használják
 - Harmadik betű: A nagybetűk a kép helyes megjelenítéséhez szükséges tokmányokhoz használatosak, a kisbetűk pedig nem fontosak a kép megjelenítéséhez.
 - Negyedik betű: A nagybetűket a vakon biztonságosan másolható tokmányokhoz használják. A kisbetűs tokmányok a képadatoktól függenek.
 
Második fejléc
Ez tartalmazza a pixelek tényleges kódolására vonatkozó információkat.
| Típus | Leírás | Állapot | Alapértelmezett érték | 
|---|---|---|---|
| 1 bájt | NUL bájt (0x00), egy FLIF16 bitfolyam csonkneve | ||
| uni_int(1,16) | Csatorna bit/pixel | Bpc == ‘0’: ismétlés(nb_channels) | 8, ha Bpc == ‘1’, 16, ha Bpc == ‘2’ | 
| uni_int(0,1) | Jelző: alpha_zero | nb_channels > 3 | 0 | 
| uni_int(0,100) | Curkok száma | nb_frame > 1 | |
| uni_int(0,60_000) | Keretek késleltetése ms-ban | nb_frames > 1: ismétlés(nb_frames) | |
| uni_int(0,1) | Jelző: has_custom_cutoff_and_alpha | ||
| uni_int(1,128) | cutoff | has_custom_cutoff_and_alpha | 2 | 
| uni_int(2,128) | alfa osztó | van_egyéni_vágás_és_alpha | 19 | 
| uni_int(0,1) | Jelző: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 | 
| ? | Bitchance | van_egyedi_esélye | |
| változó | Átalakítások (lásd lent) | ||
| uni_int(1) = 0 | Indikátor bit: transzformációkkal kész | ||
| uni_int(0,2) | Láthatatlan képpont-előrejelző | alfa_nulla && váltott soros && az alfa tartomány nullát tartalmaz | 
Csatornák
| Csatornaszám | Leírás | 
|---|---|
| 0 | Piros vagy Szürke | 
| 1 | Zöld | 
| 2 | Kék | 
| 3 | Alfa | 
Átváltozások
| Típus | Leírás | 
|---|---|
| uni_int(1) = 1 | Indikátor bit: még nem készült el | 
| uni_int(0,13) | Transformációs azonosító | 
| változó | Transformációs adatok (transzformációtól függően) | 
Az átalakítást a pixeladatok módosítására használják a jobb tömörítés érdekében, és nyomon követik a ténylegesen előforduló pixelértékeket.
Pixel adatok
Ez a rész a tényleges pixeladatokat tartalmazza MANIAC entrópia kódolással kódolva. A pixelek kódolhatók váltottsoros vagy nem váltottsoros kódolással.
Váltottsoros módszer
Ebben a módszerben a nagyítási szinteket határozzák meg. A 0-s nagyítási szint a teljes képhez, az 1-es nagyítási szint minden páros sorhoz, a 2-es nagyítási szint az 1-es nagyítási szint minden páros számú oszlopához használatos. Más szóval, minden páros számú 2k-s nagyítási szint a kép, 1:2^k méretarányban. A nagyítási szintek a legmagasabbtól a legalacsonyabbig vannak kódolva.
Nem váltott soros módszer
Ennél a módszernél a MANIAC fák kódolása azonnal megkezdődik, majd a képpontok kódolása következik.