Ztrátové formáty
JPEG File Interchange Format
Formát JFIF – JPEG File Interchange Format – představuje v současnosti asi nejoblíbenější a nejšíře podporovaný standard pro „reálné“, tj. True Color, obrázky. Přestože se jedná o implementačně vysoce složitou záležitost, setkáváme se s JPEG obrazy (jak je často a ne zcela správně tento formát také označován – JPEG značí jen typ komprese použité v souborech JFIF) prakticky kdekoli, zejména na webu. Protože je tento formát velmi rozšířen a je pro jeho úspěšné používání částečně třeba vidět do útrob použitých kompresních metod, podíváme se na JFIF poněkud podrobněji.
Kompresní metoda JPEG nabízí čtyři úrovně kódování dat – nejužívanější sekvenční, progresivní (tyto první dvě jsou ztrátové), hierarchické (které se téměř nepoužívá, ale má některé užitečné vlastnosti jako je rychlé nahlížení, podpora tisku, osvitu apod.; je rovněž ztrátové) a také bezztrátové (prediktivní). Většina dekodérů poskytuje podporu jen pro první dva způsoby kódování (totéž se týká obecně i webových prohlížečů).
Základní schéma komprese JPEG vypadá takto: barvy pixlů se musí nejprve transformovat ze vstupního barvového prostoru (nejčastěji RGB nebo CMYK) do prostoru YCbCr. Tato transformace probíhá podle uvedených transformačních rovnic a sama o sobě je bezztrátová. Složky v barevném prostoru YCbCr představují signály, kde Y nese informaci o světlosti pixlu bez ohledu na barevnost a ostatní dva signály jsou v jistém smyslu rozdílové barvové koeficienty pro modrou a červenou. Složka Y částečně odpovídá složce V resp. L v barvových systémech HSV resp. HLS.
Y = 0,299 R + 0,587 G + 0,114 B
Cb = –0,1687 R – 0,3313 G + 0,5 B + 128
Cr = 0,5 R – 0,4187 G – 0,0813 B + 128
Obraz se poté rozloží na bloky (nejčastěji 8×8 pixlů), které pak po celou dobu dalšího zpracování vystupují jako samostatné obrazové jednotky. V dalším kroku může dle nastavení docházet k tzv. podvzorkování barvových složek – několika sousedním pixlům je přiřknuta jediná „průměrná“ barva. Tento trik je založen na skutečnosti, že lidské oko daleko lépe vnímá světlost a její rozdíly než barvy. Proto dojde v podvzorkovaném obrázku (nejčastěji se průměrují oblasti 2×1, 1×2 nebo 2×2 pixely) k podstatnému úbytku informace bez většího vlivu na vizuální dojem. Další operace probíhají odděleně pro tři barvové složky. Hodnoty pixelů v blocích jsou transformovány diskrétní kosinovou transformací (DCT) a hodnoty DCT jsou kvantovány vhodnou kvantizační tabulkou (kodéry JPEG zpravidla obsahují několik kvantizačních tabulek pro různé typy dat; při kvantizaci dojde k dělení hodnot matice DCT hodnotami z kvantizační tabulky „člen po členu“). Snahou této části je dosáhnout stavu, kdy je mnoho hodnot v matici bloku nulových (vypočtené hodnoty byly zaokrouhlovány na celé číslo), ovšem právě zde nastává největší ztráta informace, protože zpětným přepočtem nemůže již být dosaženo naprosto identických původních hodnot barvových koeficientů.
Jednou ze zajímavých možností formátu JFIF je možnost ovlivnit velikost výsledného souboru pomocí koeficientu kvality Q. Pro různě nastavenou hodnotu Q kodér použije různou kvantizační tabulku (nebo interpolaci mezi dvěma nejbližšími) a do značné míry tak dojde k ovlivnění ztráty informace z obrazu. Kvantizační tabulky jsou navrženy podle vzoru, sestaveného na základě psychologických výzkumů. Výsledné matice obsahují na první pozici stejnosměrnou složku signálu (jakousi průměrnou hodnotu všech hodnot bloku) a na dalších pozicích lineární kombinace střídavých hodnot (vertikálních a horizontálních hran) klesající od levého horního rohu do pravého spodního, které se po kvantizaci linearizují od nejvyšších hodnot po nižší (neboli od nejnižší frekvence po nejvyšší), nulové hodnoty na konci odpadají. Tím se připraví tok dat pro Huffmannovo nebo aritmetické kódování, kterým se sníží jeho velikost. Obě kódování jsou bezztrátová a jsou založena na binárním stromu a zápisu často se opakujících hodnot nižším počtem bytů, než hodnot opakujících se zřídka. Zakódovaná data jsou uložena do JFIF souboru a doplněna hlavičkou, Exif informacemi a dalšími prvky.
Progresivní kódování vzdáleně připomíná prokládaný mód jiných formátů. Při sestavování datového toku z kvantovaných bloků nedochází k jejich načtení od nejnižších frekvencí signálů po nejvyšší, nýbrž k postupnému načítání jednotlivých skupin frekvencí počínaje stejnosměrným členem a nízkofrekvenčními členy, ale ze všech bloků obrazu za sebou. Tím se ve výsledku dosáhne toho, že při načítání jsou nejprve zobrazeny stejnosměrné a nízkofrekvenční členy, které už po načtení malého objemu obrázku dají hrubý vizuální dojem, který je s dalšími načtenými daty zpřesňován.
U neztrátové prediktivní komprese jsou ukládány pouze rozdíly mezi predikovanou a skutečnou hodnotou v obraze, které jsou spočteny na základě matematického predikčního modelu. K úspoře dochází, protože rozdílové hodnoty mají obecně nižší statistické charakteristiky (rozptyl aj.) než původní data. Tato metoda JPEG není obecně implementována ve všech dekodérech JPEG a podporuje ji spíše komerční software. Lze její pomocí dosáhnout kompresního poměru až 2 : 1.