Az 1980-as években a Microsoft kifejlesztett egy eszköz-agnosztikus képmegjelenítési megoldást a bitképekhez: A BMP fájlformátumot.¹ Akik korábban a Microsoft Paintet használták, élvezhették az egyszerű vonalakból és színkitöltésekből előállított gigantikus fájlméretet.
A BMP-fájlformátum lényege, hogy minden képponthoz színértéket rendelnek. Ha tehát van egy 480×360-as bittérképem, amely 16 millió színt (24 bit) támogat, A bittérkép mérete végül valahol 4 MB-tól északra lesz.
Ez persze nem ideális, ha több, jó minőségű képet szeretnénk megjeleníteni. Ezért fel kell tenni a kérdést. “Van-e mód a bittérképes ábrázolás optimalizálására úgy, hogy a kép vizuális integritása megmaradjon, de kevesebb erőforrás felhasználásával?”
A válasz igen. Kiderült, hogy a legtöbb esetben a felhasználókat inkább a képek mint vizuális segédanyagok érdeklik, mintsem az alaposság. Tegyük fel például, hogy kapok egy képet a Golden Gate hídról az alábbiak szerint:
Az ötlet itt az, hogy ahogy az emberi szem a DCT-referencia bal felső részétől a jobb alsó rész felé halad, annál nehezebb azt érzékelni. Tehát általában az történik, hogy az együtthatók hozzárendelésekor a bal felső rész nagyon magas értéket kap, és ez csökken, ahogy átlósan haladunk lefelé.
Így nézhet ki a dolog numerikus formátumban:
7. ábra – Eredeti darab (balra) Új darab a DCT alkalmazása után (jobbra)
4. LÉPÉS. Kvantálás
A DCT alkalmazása után a következő lépés a kvantálás. Itt egy kvantálási táblázatot alkalmaznak a kapott DCT-értékekre. A táblázat tömörítési algoritmusonként eltérő, és egyes szoftverek lehetővé teszik a felhasználó számára, hogy beállítsa a kívánt kvantálás mértékét. Az alábbiakban egy szabványos táblázatot mutatunk be:
8. ábra – Egy szabványos kvantálási táblázat
Figyeljük meg, hogy a számjegyek egyre magasabbak, ahogy haladunk a bal felsőtől a jobb alsó felé. Ez szándékos. A kvantálás lényege, hogy a DCT-ből származó adatokat a kvantálási táblázattal felosztjuk. Ez az a pont, ahol a tömörített kép sokat veszít az adataiból. Mivel a jobb alsó számok magasak, a legtöbb értéke az osztás után végül nullává válik. Így nézhet ki:
A Huffman-kódolás a tömörítés utolsó lépése. A következőképpen működik.
Tegyük fel, hogy egy számtartományt bitek segítségével akarok ábrázolni. Ráadásul úgy akarom ábrázolni őket, hogy az ábrázoláshoz a lehető legkevesebb bitet használjam fel. Ez úgy történhet, hogy a nagymértékben ismétlődő számok alacsonyabb biteket kapnak. Ha például a nulla sokat reprezentálódik, akkor általában alacsonyabb biteket rendelnék hozzá. A Huffman-kódolás alaposabb magyarázata itt található.
Az ötlet itt az, hogy kevesebb bitet használunk egy hosszabb értékkészlet ábrázolásához. A Huffman-kódolás egy veszteségmentes tömörítési algoritmus, amelyet szöveges fájlok tömörítésénél is használnak. Ezzel akár az eredeti méret 50%-át is megtakaríthatjuk.
Mi következik?
A tömörítés csupán az egyenlet egyik része. Amikor a képet renderelni kell, meg kell fordítani a tömörítési folyamatot, mielőtt a képet a képernyőn megjeleníthetnénk.
A JPEG nagyjából 90%-kal kisebb, mint bittérképes megfelelője. A mai napig ez még mindig a legnépszerűbb képtömörítési formátum. Az újabb algoritmusok, például a HEIF (2013) és az AVIF (2018) növeli a tömörítési algoritmushoz felhasználható pixelek körét.²
A JPEG népszerűsége ellenére az újabb formátumok jobb tömörítést biztosítanak. A WebP például általában körülbelül 70%-kal kisebb, mint a JPEG, mégis képes megőrizni a kép vizuális integritását. Ezért a Google (a WebP-t kifejlesztő vállalat) arra ösztönzi a fejlesztőket, hogy a képeiket JPEG-ről WebP-re kódolják át. A WebP támogatása azonban még mindig kisebb, mint a JPEG-é. Ebből adódóan mindkét formátumot támogatni kell.”
¹ “A BMP fájlformátum”. Előkészítés. Hozzáférés: 2019. április 19. https://www.prepressure.com/library/file-formats/bmp.
² A Netflix 2018-ban tette közzé az első AVIF-képkészletet. E bejegyzés időpontjában a képek még mindig elérhetőek itt. Az olyan vállalatok, mint a Firefox és a Microsoft hamarosan támogatni fogják ezt a képet a szoftverkínálatukban.