Programujeme JPEG: Interní struktura souborů typu JFIF/JPEG

25. 1. 2007
Doba čtení: 14 minut

Sdílet

V dnešním článku si ukážeme, jak vypadá vnitřní struktura souborů typu JFIF (JPEG Format Interchange File), které se většinou označují pouze jako soubory typu JPEG. Řekneme si, jakým způsobem je strukturovaná hlavička souborů JFIF/JPEG a jaké nejdůležitější značky (markers) se mohou v souborech tohoto typu vyskytovat.

Obsah

1. Struktura souborů typu JFIF/JPEG
2. Nejdůležitější značky
3. Hlavička souborů JFIF/JPEG
4. Tabulky kvantizačních koeficientů
5. Huffmanovy kódovací tabulky
6. Obsah dalšího pokračování tohoto seriálu

1. Struktura souborů typu JFIF/JPEG

Jak již bylo napsáno v perexu, je dnešní část seriálu o grafických formátech věnována popisu interní struktury souborů typu JFIF, neboli JPEG Format Interchange File. Tyto soubory jsou (poněkud nepřesně) známé pouze jako soubory či obrázky typu JPEG, čemuž odpovídá a jejich koncovka – .jpeg či .jpg (s koncovkou .jfif se setkáme pouze v ojedinělých případech). Proč se však tyto soubory mají označovat zkratkou JFIF, když jsme si až doposud popisovali komprimaci typu JPEG? Již v předchozích částech tohoto seriálu jsme si řekli, že specifikace vydaná konsorciem JPEG „pouze“ určuje, pomocí jakých postupů mají být zakódována obrazová data, tj. hodnoty jednotlivých pixelů v rastru. Základní (baseline) postup už známe: převod do barvového prostoru YCbCr, provedení DCT, kvantizace DCT koeficientů, zig-zag sken a následná komprimace pomocí Huffmanova a RLC kódování.

Specifikace JPEG (konkrétně se jedná o specifikace popsané v normách ISO 10918–1 či CCITT T.81, což je v podstatě to samé) však nestanoví žádný konkrétní formát souborů, tj. hlavičky, způsob zabezpečení dat, obalení dat do kontejnerů, umístění synchronizačních značek apod. V současnosti dokonce existuje několik značně rozdílných souborových formátů, které interně JPEG používají; jmenujme například TIFF, PostScript, PDF či MOV (kontejner používající mimo jiné i video uložené ve formátu Motion JPEG). Nejznámějším a nejpoužívanějším formátem je však formát JFIF, který navrhla firma C-Cube Microsystems a který se prakticky stal synonymem pro JPEG. V dalším textu proto budu používat označení JFIF/JPEG – to by mělo uspokojit jak běžné uživatele znající JPEG, tak i odborníky na počítačovou grafiku, kteří se drží spíše označení JFIF, aby odlišili souborový formát a způsob zpracování obrazových dat.

Ve druhé kapitole si popíšeme obecnou strukturu hlavičky souborů JFIF/JPEG, zejména takzvanou minimální hlavičku, kterou musí obsahovat všechny korektní soubory tohoto typu. V kapitole třetí si řekneme, jaké nejdůležitější značky (markers) se v souborech typu JFIF/JPEG mohou objevit. V následující kapitole si ukážeme způsob uložení tabulek kvantizačních koeficientů a konečně v kapitole páté strukturu kódovacích tabulek použitých při Huffmanově a RLC kódování.

2. Nejdůležitější značky

Před vlastním popisem interní struktury souborů typu JFIF/JPEG si musíme říci, jakým způsobem jsou uloženy informace zabírající více bytů. V těchto souborech je použit systém uložení dvoubytových a čtyřbytových číselných hodnot v uspořádání big endian, tj. byte s nejvyšší váhou se v souboru nachází na prvním místě. Například slovo s hodnotou 0×ff00 je uloženo tak, že na prvním místě je byte 0×ff a na druhém místě byte 0×00. Toto uspořádání bytů odpovídá například většině binárních internetových formátů a protokolů, proto se mu také někdy říká network byte order. Jedná se o nativní formát platforem Apple Macintosh, Sun, Atari ST, Amiga apod. Na platformě Intel x86 je nutné provádět převody pomocí knihovních maker, například htons() apod.

Soubory typu JFIF/JPEG jsou rozděleny do takzvaných segmentů (segments), kde každý segment je představován proudem bytů o maximální délce 65535. Každý segment začíná takzvanou značkou (marker), což je dvoubytová hodnota, kde první byte má vždy hodnotu 0×ff (tj. 255 decimálně) a druhý byte nabývá podle typu značky hodnot od 0×01 do 0×fe. Hodnoty 0×00 a 0×ff u druhého byte značky nejsou použity, aby se zaručila synchronizace v případě, že při přenosu obrázku dojde k chybě. Pokud k takové situaci dojde, postačuje, aby dekodér našel v proudu bytů hodnotu 0×ff následovanou hodnotou 0×01–0×fe a může provést synchronizaci s tím, že předchozí data sice nebude umět rekonstruovat, ale zbytek obrázku už ano.

Z tohoto důvodu se v samotných datech nikdy nesmí objevit samostatná hodnota 0×ff, ale musí být doplněna bytem s hodnotou 0×00. Pro nás má tato struktura jednu výhodu – při zkoumání obsahu souborů JFIF/JPEG nám postačí v hexadecimálním editoru hledat výskyt bytů 0×ff následovaných nenulovou hodnotou a podle této dvojice bytů již víme, jaký segment na tomto místě začíná. Máme totiž jistotu, že takto uspořádaná dvojice bytů vždy značí začátek segmentu, v datech by se nikdy neměla objevit.

Jako ukázkový soubor typu JFIF/JPEG jsem zvolil obrázek o rozlišení 16×16 pixelů, který obsahuje čtyři různobarevné bloky o velikosti 8×8 pixelů (pokud vám obrázek připomíná logo jednoho nejmenovaného operačního systému, jde o podobnost čistě náhodnou, barvy jsou totiž přehozené a patent na kombinaci těchto čtyř barev snad nikdo nevlastní, že. Ukázkový obrázek vypadá následovně:

16x16_jpeg

Ukázkový obrázek o rozlišení 16×16 pixelů

Následuje hexadecimální výpis struktury tohoto obrázku, který si dále podrobněji popíšeme (celková délka souboru je pouhých 344 bytů, rozbalená délka pixmapy je rovna 16×16×3=768 bytům):

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

Jak jsme si již řekli v předchozích odstavcích, jsou soubory JFIF/JPEG složeny ze segmentů o maximální délce 64 kB. Každý segment začíná takzvanou značkou (marker), která jednoznačně identifikuje jeho obsah. Značka sestává z dvojice bytů, první byte je vždy roven 0×ff a druhý byte může být v rozsahu 0×01–0×fe. V následující tabulce jsou vypsány nejdůležitější značky, se kterými se můžeme v souborech typu JFIF/JPEG setkat:

Značka Plný název Hodnota Význam
SOI Start Of Image 0×ffd8 značka umístěná na začátku souboru
EOI End Of Image 0×ffd9 značka umístěná na konci souboru
RSTi Restart Marker i 0×ffd0+i značky určené pro synchronizaci (pokud jsou značky použity, tak se periodicky opakují)
SOF0 Start Of Frame 0 0×ffc0 specifikace tvaru obrazových dat
SOS Start Of Scan 0×ffda začátek vlastních kódovaných obrazových dat
APP0 Application Marker 0×ffe0 značka identifikující soubor JFIF
COM Comment 0×fffe jednoduchý textový komentář se zadanou délkou
DNL Define Number Of Lines 0×ffdc počet řádků (dnes se již nepoužívá)
DRI Define Restart Interval 0×ffdd interval výskytu synchronizačních značek RSTi
DQT Define Quantization Table 0×ffdb začátek segmentu koeficientů kvantizační tabulky
DHT Define Huffman Table 0×ffc4 začátek segmentu kódových slov Huffmanova kódování

3. Hlavička souborů JFIF/JPEG

Samotná hlavička souboru typu JFIF/JPEG začíná dvojicí bytů s hodnotou 0×ff a 0×d8. Jak již víme z předchozího popisu, dvojice bytů začínající hodnotou 0×ff představuje značku, v tomto případě se jedná o značku SOI (Start Of Image). Za touto značkou následuje segment nazvaný APP0, který začíná značkou s hodnotou 0×ff a 0×e0. Za touto značkou je uložena dvoubytová hodnota segmentu, která musí být větší nebo rovna šestnácti. V našem ukázkovém souboru je přesně rovna 16, protože samotná délka má hodnotu 0×00 0×10. Po délce by měla další pětice bytů obsahovat hodnoty 0×4a 0×46 0×49 0×46 0×00, což není nic jiného než nulou ukončený ASCII řetězec „JFIF“, který je v literatuře také nazývaný password. Následuje číslo verze ve formátu verze.subverze. Číslo verze, které je uloženo v jednom bytu, by mělo být rovno 0×01, číslo subverze (také uložené v jednom bytu) pak může nabývat některé hodnoty z rozsahu 0×00..0×02.

Další informace v hlavičce se již vztahují k samotnému obrázku. První informační byte říká, jaké jednotky jsou použity pro specifikaci rozlišení (ne velikosti). Tento byte může nabývat hodnot:

Hodnota byte Význam
00 žádné jednotky nejsou použity, rozlišení je zadáno v bezrozměrných pixelech
01 rozlišení je zadáno v DPI (dots per inch)
02 rozlišení je zadáno v DPCM (dots per cm)

V našem ukázkovém souboru je uložena hodnota 0×01, tj. rozlišení je specifikováno v počtu bodů na palec (DPI). Za tímto bytem se již nachází dvojice bytů s rozlišením v horizontálním směru následovaná dvojicí bytů specifikujících rozlišení ve směru vertikálním. Náš ukázkový soubor obsahuje sekvenci 0×00 0×60 0×00 0×60, což značí rozlišení 96 DPI. Po těchto hodnotách následuje byte obsahující horizontální šířku náhledového obrázku, další byte obsahuje výšku náhledového obrázku v pixelech. Většinou se náhledový obrázek neukládá, takže dvojice bytů má hodnotu 0×00 0×00. Těmito byty současně celá hlavička souboru končí. V následující tabulce je uveden soupis všech bytů použitých v hlavičce ukázkového obrázku:

Offset Sekvence bytů Význam sekvence
00 ff d8 značka SOI – Start Of Image
02 ff e0 značka APP0 – začátek stejnojmenného segmentu
04 00 10 délka segmentu APP0 je šestnáct bytů (včetně samotné délky)
06 4a 46 49 46 00 nulou ukončený řetězec „JFIF“
11 01 číslo verze je 1
12 01 číslo subverze je také 1
13 01 rozlišení obrázku je zadáno v DPI (dots per inch)
14 00 60 horizontální rozlišení je 96 DPI
16 00 60 vertikální rozlišení je 96 DPI
18 00 šířka náhledového obrázku je 0 pixelů
19 00 výška náhledového obrázku je 0 pixelů

Byty, které náleží k hlavičce, začínají od offsetu 0 a jsou zvýrazněny na následujícím výpisu:

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

4. Tabulky kvantizačních koeficientů

V předchozí kapitole jsme si uvedli některé nejpoužívanější značky umístěné v souborech typu JFIF/JPEG. Jednou z velmi důležitých informací, které je možné v těchto souborech nalézt, jsou tabulky kvantizačních koeficientů použitých při kvantizaci prováděné ihned po DCT. Tyto tabulky začínají značkou DQT, která je v souboru identifikovatelná dvojicí bytů 0×ffdb. Po této dvojici bytů následuje délka, opět uložená jako dvoubytové slovo. Ihned po délce je umístěn velmi důležitý byte, ve kterém je zakódován jak typ tabulky, tak i počet bitů použitých pro uložení jednotlivých koeficientů. Význam tohoto bytu je následující:

Bity Význam
0..3 Číslo kvantovací tabulky
4..7 Počet bitů na koeficient: 0=8 bitů, jinak 16 bitů

Po těchto údajích již následují hodnoty jednotlivých kvantizačních koeficientů, které jsou uspořádány podle cik-cak sekvence. Těchto koeficientů je vždy 64 a jsou tedy uloženy buď na 64 bytech (8 bitů na koeficient) nebo na 128 bytech (16 bitů na koeficient). Teoreticky je sice možné do souboru uložit až 16 kvantovacích tabulek, ve skutečnosti jsou však ukládány pouze tabulky dvě: první pro barvové koeficienty Y, druhá pro barvové koeficienty Cb a Cr.

V našem demonstračním obrázku jsou uloženy dvě kvantizační tabulky. První tabulka, která je platná pro barvovou složku Y (luminance), je uložena v bytech umístěných od offsetu 20:

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

Tento segment má následující strukturu:

Sekvence bytů Význam sekvence
ff db značka DQT
00 43 délka segmentu je 67 bytů (včetně délky)
00 číslo kvantizační tabulky je 0, počet bitů na koeficient je roven osmi
03 02… následuje 64 bytů s hodnotami jednotlivých koeficientů

Druhá kvantizační tabulka, která je platná pro barvové složky Cb a Cr (chrominance), je umístěna od offsetu 89:

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

Jediný rozdíl (samozřejmě kromě rozdílných hodnot samotných kvantizačních koeficientů) spočívá v odlišném číslu kvantizační tabulky, které je uloženo v pátém bytu segmentu DQT.

5. Huffmanovy kódovací tabulky

Huffmanovy kódovací tabulky začínají značkou DHT, která je v souboru identifikovatelná dvojicí bytů 0×ffc4. Za touto dvojicí bytů následuje délka segmentu (dva byte) a posléze jeden byte se zakódovaným číslem a typem tabulky:

Bity Význam
0..3 číslo Huffmanovy kódovací tabulky z rozsahu 0..3
4 typ kódovací tabulky 0=DC, 1=AC
5..7 tyto bity musí být nastaveny na nulu

Po těchto údajích následuje sekvence šestnácti bytů, které obsahují počty symbolů pro délky kódových slov 1 až 16. Součet hodnot těchto bytů udává celkový počet kódů, který musí být menší než 256 (maximální délka kódového slova je však šestnáct bitů, protože Huffmanův kód je prefixový). Následuje n bytů (n=počet kódů), ve kterých jsou postupně uloženy symboly, ze kterých se při inicializaci dekodéru vytváří binární strom.

V našem demonstračním obrázku jsou uloženy čtyři Huffmanovy kódovací tabulky, které jsou na níže uvedených hexadecimálních výpisech souboru s obrázkem zvýrazněny tučným písmem.

První kódovací tabulka

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

První kódovací tabulka má celkovou délku 23 bytů, z toho 2 byty zabírá samotná informace o délce, 1 byte obsahuje číslo a typ tabulky (zde se konkrétně jedná o tabulku číslo 0 – pro barvové složky Y obsahující symboly DC koeficientů) a 16 bytů obsahuje počty symbolů pro jednotlivé délky kódových slov. Po rozkódování celého segmentu získáme následující informace:

Délka kódového slova
v bitech
Počet symbolů
v tabulce
Hodnoty
symbolů
01 00
02 03 02 07 08
03 01 0a
04 00
05 00
06 00
07 00
08 00
09 00
10 00
11 00
12 00
13 00
14 00
15 00
16 00

Druhá kódovací tabulka

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

Druhá kódovací tabulka má číslo 0 (barvová složka Y) a jsou v ní uložena kódová slova pro AC koeficienty. Její délka je 20 bytů a obsahuje pouze jednu hodnotu symbolu, který značí konec bloku (EOB – End Of Block). Je to z toho důvodu, že testovací obrázek vlastně neobsahuje žádné vyšší frekvence barvové složky Y, ale pouze její DC složky. V obrázku se sice nachází hrany mezi jednotlivými barvami, tyto hrany však leží na hranici bloků 8×8 pixelů a nemají tedy vliv na AC složky.

Délka kódového slova
v bitech
Počet symbolů
v tabulce
Hodnoty
symbolů
01 01 00
02 00
03 00
04 00
05 00
06 00
07 00
08 00
09 00
10 00
11 00
12 00
13 00
14 00
15 00
16 00

Třetí kódovací tabulka

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

Třetí kódovací tabulka má číslo 1 (barvové složky CbCr) a obsahuje kódová slova pro DC koeficienty. Opět je uloženo pouze jedno kódové slovo pro délku 1 bit, toto slovo má hodnotu 0×06 (prakticky se jedná o průměrnou hodnotu složek Cb a Cr v celém obrázku převedenou pomocí DCT do frekvenční oblasti).

Čtvrtá kódovací tabulka

0000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60
0000010: 00 60 00 00 ff db 00 43 00 03 02 02 03 02 02 03
0000020: 03 03 03 04 03 03 04 05 08 05 05 04 04 05 0a 07
0000030: 07 06 08 0c 0a 0c 0c 0b 0a 0b 0b 0d 0e 12 10 0d
0000040: 0e 11 0e 0b 0b 10 16 10 11 13 14 15 15 15 0c 0f
0000050: 17 18 16 14 18 12 14 15 14 ff db 00 43 01 03 04
0000060: 04 05 04 05 09 05 05 09 14 0d 0b 0d 14 14 14 14
0000070: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000080: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
0000090: 14 14 14 14 14 14 14 14 14 14 14 14 14 14 ff c0
00000a0: 00 11 08 00 10 00 10 03 01 22 00 02 11 01 03 11
00000b0: 01 ff c4 00 17 00 00 03 01 00 00 00 00 00 00 00
00000c0: 00 00 00 00 00 00 02 07 08 0a ff c4 00 14 10 01
00000d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000e0: ff c4 00 14 01 01 00 00 00 00 00 00 00 00 00 00
00000f0: 00 00 00 00 00 06 ff c4 00 23 11 00 02 01 01 08
0000100: 03 01 00 00 00 00 00 00 00 00 00 11 13 12 61 06
0000110: 07 14 15 21 23 41 42 02 03 16 17 ff da 00 0c 03
0000120: 01 00 02 11 03 11 00 3f 00 9c 84 41 34 1a 0d 7e
0000130: b6 67 f1 8c b7 7b 17 8b 6f 55 41 4a af b2 52 65
0000140: 00 e4 e8 c6 e6 6d 0f c3 66 1b 4e 72 bb 40 41 94
0000150: f2 26 54 03 93 a7 ff d9 

Poslední, tj. čtvrtá kódovací tabulka má číslo 1 (CbCr) a obsahuje kódová slova pro AC koeficienty. V této tabulce je umístěno větší množství symbolů, protože barvonosné signály byly převzorkovány v poměru 2:1 a kódovaný blok 8×8 hodnot tedy obsahuje hrany, které je potřeba pomocí AC koeficientů zakódovat. Z tohoto důvodu je také tato tabulka největší.

bitcoin_skoleni

6. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování tohoto seriálu dokončíme popis segmentů, které se mohou v obrázcích vyskytovat. Také si ukážeme jednoduchou demonstrační aplikaci, která slouží k výpisu základních informací ze souborů typu JFIF/JPEG, včetně kvantizačních tabulek a Huffmanových kódovacích tabulek.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.