Hlavní navigace

Grafický formát PCX - výlet do historie PC

16. 11. 2006
Doba čtení: 12 minut

Sdílet

Dnešní článek je věnován již notně zastaralému, ale stále používanému formátu, který se nazývá PCX. Jedná se o formát využívající jednoduchou bezeztrátovou komprimaci založenou na algoritmu RLE. Na PCX je jasně patrná nekoncepčnost návrhu a závislost prvních verzí tohoto formátu na použitých grafických kartách, resp. jejich videorežimech.

Obsah

1. Úvodní informace o grafickém formátu PCX
2. Hlavička grafického souboru typu PCX
3. Černo-bílé obrázky uložené ve formátu PCX
4. Čtyřbarevné obrázky uložené ve formátu PCX
5. Šestnáctiba­revné obrázky uložené ve formátu PCX
6. PCX a obrázky s 256 barvami
7. PCX a plnobarevné (truecolor) obrázky
8. Obsah dalšího pokračování tohoto seriálu

1. Úvodní informace o grafickém formátu PCX

Grafický formát PCX vyvinula firma ZSoft Corporation, která ho v minulosti používala ve všech verzích svých známých grafických editorech PC-PaintBrush. Tyto aplikace zpočátku pracovaly pouze pod operačním systémem DOS (MS-DOS, DR-DOS apod.) na počítačích kompatibilních s IBM PC a posléze i v Microsoft Windows 3.0 a Microsoft Windows 3.1. Kromě grafických editorů PC-PaintBrush je však tento typ souborů použitý i v mnoha dalších graficky orientovaných aplikacích včetně her.

Na tomto grafickém formátu je jasně patrná nekoncepčnost návrhu, samotný formát (hlavička souboru i uložení rastrových dat) totiž kopíroval možnosti tehdejších grafických karet, tj. zejména značně omezený počet barev, organizaci dat do bitových rovin, krátkou barvovou paletu apod. S dalším rozvojem grafických schopností počítačů PC docházelo k nárůstu složitosti celého formátu PCX a různým ad-hoc řešením, například umístěním větší barvové palety nikoli přímo do hlavičky obrázku, ale na samotný konec souboru.

Z těchto důvodů bychom mohli grafický formát PCX považovat spíše za odstrašující příklad (jak se nemá navrhovat souborový formát), kterým se nemá cenu podrobněji zabývat. Situace je však složitější, protože se ve své době jednalo o dobře popsaný formát, který navíc nabízel i jednoduše použitelnou komprimaci, která byla při vhodně zvolené barvové paletě pro některé typy obrázků poměrně účinná. Nesmíme také zapomenout na fakt, že PC-PaintBrush patřil na PC mezi nejpoužívanější grafické editory, i když svými schopnostmi zaostával například za editory používanými na Amigách (Deluxe Paint apod.).

Z výše uvedených důvodů se PCX stal velmi populární a postupně přešel z počítačů řady PC i na další platformy, dokonce jsem viděl i prohlížeč PCX běžící na osmibitových počítačích. Musíme si však uvědomit, že na platformách odlišných od PC byl PCX spíše trpěným formátem, protože například dobře nepodporoval grafické schopnosti dalších počítačů (Amiga a její režim HAM, Atari ST, Sunovské stanice). Moderní prohlížeče si s grafickým formátem PCX, který existuje v několika variantách, poradí docela dobře, stejně tak i některé grafické editory (například i starší verze programu „Malování“ PCX podporovaly, novější však již nikoli).

V předchozích odstavcích jsem napsal, že grafický formát PCX existuje v několika verzích. Tyto verze se chronologicky odvozují od verzí programu PC-PaintBrush a od jeho grafických schopností. Ty samozřejmě závisely na podpoře grafických karet – v dobách MS-DOSu nic podobného ovladačům grafických karet neexistovalo, vše se řešilo přes BIOS a přímým přístupem na porty a do obrazové paměti. V prvních verzích PC-PaintBrush podporoval pouze grafické karty CGA (černo-bílé a čtyřbarevné obrázky), posléze se přidávala podpora pro další grafické karty (EGA, VGA, SVGA) až do chvíle, kdy byl program portován na Microsoft Windows, které ovládání grafických karet kompletně převzaly a aplikace na nich přestala být závislá. Nejnovější verze formátu podporuje uložení obrázků obsahujících pravé barvy, což je od původních CGA obrázků opravdu velký kvalitativní i kvantitativní skok. Číslo verze PCX je uloženo přímo v hlavičce tohoto souborového formátu:

Verze PCX Verze PaintBrushe Schopnosti
0 PC Paintbrush 2.5 ukládané obrazy odpovídají schopnostem CGA
2 PC Paintbrush 2.8 šestnáctibarevné obrazy s barvovou paletou
3 PC Paintbrush 2.8 šestnáctibarevné obrazy, ale bez barvové palety
4 PC Paintbrush pro Windows truecolor grafika, podpora sekundární palety
5 PC Paintbrush 3.0+ truecolor grafika, podpora sekundární palety

V dnešní době většina grafických konvertorů vytváří obrázky s označením verze 5, i když mohou obsahovat i méně barev. Verze jsou totiž do značné míry zpětně kompatibilní.

2. Hlavička grafického souboru typu PCX

Grafický soubor typu PCX obsahuje hlavičku, která má vždy délku 128 bytů. Nejzajímavější však je, že je využito pouze 70 bytů (a to ještě ne vždy, zejména nižší verze neobsahují všechny níže popsané informace), zbývajících 58 bytů může využít aplikace, ovšem s tím, že se jejich obsah může kdykoliv, například po konverzi a/nebo editaci přepsat. Hlavička je tedy využita pouze minimálně, dokonce ještě méně úsporně, než je tomu v grafickém formátu BMP! Její formát je v případě PCX následující:

Offset Velikost (byte) Položka Význam
0 1 Manufacturer vždy obsahuje číslo 0×0a
1 1 Version číslo verze – viz předchozí tabulka
2 1 Encoding typ kódování: 0-žádné, 1-RLE
3 1 Bits per pixel počet bitů na pixel v obrazové rovině
4 8 Window dimension souřadnice obrazu X1, Y1, X2, Y2 (little endian)
12 2 Horizontal resolution horizontální rozlišení
14 2 Vertical resolution vertikální rozlišení
16 48 Color map barvová paleta o rozsahu max. 16 barev
64 1 Reserved rezervovaná položka
65 1 Color planes počet obrazových (bitových) rovin
66 2 Bytes per line počet bytů na obrazový řádek
68 2 Palette info způsob interpretace palety: 0-barvy, 1-odstíny šedi
70 58 Nonused nepoužito, možné využití aplikací
127 rastrová data

První byte hlavičky by vždy měl obsahovat magické číslo 0×0a. Následuje číslo verze, jehož význam byl uveden v první tabulce (toto číslo většinou můžeme ignorovat, protože vše potřebné je uloženo v dalších položkách hlavičky). Následuje byte, ve kterém je uvedeno, zda je použito kódování RLE, tj. jednoduchá forma komprimace, či zda jsou uložena nekomprimovaná rastrová data. Položka Bits per pixel je pojmenovaná poněkud nešťastně, protože neudává celkový počet bitů na pixel, ale počet bitů na pixel v jedné obrazové (bitové) rovině.

Po těchto údajích následují informace o velikosti obrázku a rozlišení. Prvních osm bytů obsahuje krajní souřadnice obrazu X1, Y1, X2 a Y2. Každá souřadnice zabírá dva byty uložené za sebou v systému little endian, jak je tomu na procesorech Intel zvykem. Další dva byty obsahují horizontální rozlišení (například pro starší grafické karty je zde hodnota 640 pixelů) následované vertikálním rozlišením (typicky 350, 400, 480 pixelů). Modernější aplikace zde spíš ukládají rozlišení zadané v DPI, například 300 – jde však o jiný význam slova „rozlišení“.

Vidíme, že v hlavičce se našlo místo i pro barvovou paletu, ovšem pouze pro šestnáct barev (16×3=48 bytů). To postačuje pro ukládání obrázků použitelných na grafických kartách EGA a VGA (kromě režimu 0×13), ovšem pro obrázky s 256 barvami už kapacita barvové palety nedostačuje. Způsob, jakým se tento nedostatek formátu PCX systémem ad-hoc vyřešil, si podrobněji popíšeme ve čtvrté kapitole.

Po jednom byte, který je rezervován (nemá žádný zvláštní význam a je vhodné ho nulovat) následuje velmi důležitá informace – počet obrazových (bitových) rovin následovaný počtem bytů na obrazový řádek. Počet bitových rovin je velmi důležitý údaj, protože spolu s počtem bitů na pixel udává skutečnou bitovou hloubku obrázku. Za touto informací už následuje pouze jeden významný byte, ve kterém je uloženo, zda se má barvová paleta chápat jako monochromatická nebo barevná (tento byte je však přítomen pouze u novějších verzí PCX).

Vztah mezi počtem bitů na bitovou rovinu a počtem bitových rovin může být matoucí, proto si uvedeme tabulku, která snad vše objasní. Podrobnější informace o jednotlivých typech obrázku budou uvedeny v následujících kapitolách:

Typ obrazu Bitů na pixel Počet bitových rovin
CGA, černo-bílý 1 1
CGA, 4 barvy 2 1
EGA, 8 barev 1 3
EGA, 16 barev 1 4
VGA, 16 barev 1 4
VGA, 16 barev 4 1
VGA, 256 barev 8 1
SVGA, truecolor 8 3

3. Černo-bílé obrázky uložené ve formátu PCX

Nejjednodušším typem obrázků, které je možné ukládat ve formátu PCX jsou černo-bílé obrázky, někdy nazývané pérovky. Tento typ obrázků byl podporován už od prvních verzí PCX, protože první grafická karta dostupná pro PC, tj. CGA může být přepnuta do video režimu s rozlišením 640×200 pixelů a i modernější grafické karty (včetně Herculesu 720×348 pixelů, VGA 640×480 pixelů či hi-res režimu Atari ST) obdobný grafický režim podporují. Černo-bílý obrázek uložený ve formátu PCX se vyznačuje tím, že počet bitů na pixel je v hlavičce nastaven na hodnotu 1 a taktéž počet bitových rovin je nastaven na jedničku.

Každý pixel je v bitmapě reprezentován jedním bitem a vzhledem k tomu, že počet bytů na řádek vždy udává počet pixelů dělitelný osmi, znamená to, že se na konci každého řádku může nacházet 1–7 nevyužitých bitů, na což je potřeba dávat pozor při implementaci čtečky či zapisovačky PCX. Osmice sousedních pixelů je sdružena do jednoho bytu, přičemž proud bytů může být podroben komprimaci RLE tak, jak to bude popsáno v následující části tohoto seriálu. Testovací černo-bílý obrázek vytvořený ve formátu PCX je uložen zde, tentýž obrázek, ovšem převedený do formátu PNG, je zobrazený níže.

pcx1

Obrázek 1: Černo-bílý testovací obrázek (převedený do PNG)

Na první pohled by se mohlo zdát, že černo-bílé obrázky již v dnešní době nemá smysl používat. Při práci s grafikou, která má být zobrazitelná na monitorech nebo na televizi (případně na videu), je to jistě pravda, osobně jsem však černo-bílé PCX obrázky již několikrát s úspěchem použil. Bylo to při přípravě podkladů pro tisk, protože použitý software (v té době EmTeX pro DOS) podporoval import černo-bílé grafiky právě ve formátu PCX nebo v BMP. Pro předtiskovou přípravu (například pro laserové tiskárny nebo osvitové jednotky) se jedná o ideální formáty, protože dovolují využít pravý WYSIWYG, tj. každý pixel zobrazený na obrazovce bude vytištěn na stejném místě. Prostorové nároky jsou samozřejmě enormní, protože použité obrázky musí být připraveny pro rozlišení daného tiskového zařízení.

Například obrázek o požadované velikosti 6×6 cm na papíře musí mít rozlišení cca 1400×1400 pixelů v případě použití laserové tiskárny s 600 DPI a pro osvitovou jednotku s 2400 DPI už stejně velký obrázek musí být zvětšen na cca 5700×5700 pixelů.

pcx2

Obrázek 2: Černo-bílý graf určený pro přípravu tisku (pro účely zobrazení převedený do PNG)

4. Čtyřbarevné obrázky uložené ve formátu PCX

Čtyřbarevné obrázky typu PCX byly také vytvářeny na grafických kartách CGA, většinou v rozlišení 320×200 pixelů (modernější grafické karty čtyřbarevné grafické módy nepodporovaly, samozřejmě kromě kompatibilního režimu s CGA). Tyto obrázky jsou v některých případech uloženy v poněkud netypické podobě, která vychází z grafických schopností karet CGA. Počet bitů na pixel je nastaven na hodnotu 2, počet bitových rovin na jedničku. Pixely jsou tedy ukládány tak, že se vždy čtveřice pixelů (každý reprezentovaný dvěma bity) uloží do jednoho bytu. Proud bytů může být opět komprimovaný metodou RLE; tato metoda bude popsána příště.

pcx3

Obrázek 3: Screenshot ze hry běžící ve čtyřbarevném režimu CGA

Zvláštní na čtyřbarevných obrázcích je interpretace barvové palety. Grafická karta CGA totiž neumožňovala použití klasické barvové palety, tj. trojice hodnot RGB (Red, Green, Blue). Místo toho je v barvové paletě (na prvních dvou místech) uložena barva pozadí a barva popředí tak, že význam má pouze první byte z trojice. Pokud hodnotu prvního bytu v paletě vydělíme 16 (například bitovým posunem), dostaneme hodnotu 0–7 (horní bit je vždy nulový), která specifikuje barvu pozadí. Barva popředí je podobným způsobem uložena v prvním bytu druhé pozice v barvové paletě. Ze získané hodnoty 0–7 je možné barvu dekódovat následujícím způsobem:
2.bit: 0=barva/1=monochrom
1.bit: 0=paleta bez modré složky/1=paleta s modrou složkou
0.bit: 0=menší intenzita/1=větší intenzita

pcx4

Obrázek 4: CGA je typický výrobek IBM: drahá karta, nízké rozlišení, omezený počet barev, prakticky neexistující barevná paleta, neergonomické frekvence, obtížné programování

pcx5

Obrázek 5: Na jiných systémech stejná hra vypadá o mnoho lépe (256 barev)

5. Šestnáctibarevné obrázky uložené ve formátu PCX

Šestnáctibarevné obrázky jsou podporovány od PCX verze 2.0. Mezi grafické karty, které nabízí video režimy se šestnácti barvami, patří především karty EGA a VGA. Obrázky s maximálně šestnácti barvami mohou být uloženy dvěma odlišnými způsoby:

  1. První způsob spočívá ve využití jedné bitové roviny a čtyř bitů na pixel. Tomu také odpovídají hodnoty uložené v hlavičce v položkách Bits per pixel a Color planes.
  2. Druhý způsob naopak používá čtveřici bitových rovin a v každé bitové rovině je pro jeden pixel rezervován pouze jeden bit – tento způsob více odpovídá způsobu práce s šestnáctibarevnou grafikou na PC a proto byla tato varianta PCX více používaná, i když poněkud snižuje komprimační poměr. Pokud jsou použity čtyři bitové roviny, je způsob jejich ukládání následující:
    1.bitová rovina, 1.řádek
    2.bitová rovina, 1.řádek
    3.bitová rovina, 1.řádek
    4.bitová rovina, 1.řádek
    1.bitová rovina, 2.řádek
    2.bitová rovina, 2.řádek
    3.bitová rovina, 2.řádek
    4.bitová rovina, 2.řádek …

Šestnáctibarevné obrázky využívají celou barevnou paletu uloženou v hlavičce PCX. Každá barva je zakódována trojicí bytů, tj. celkem je nutné pro paletu rezervovat 16×3=48 bytů. Některé grafické karty, například EGA, mají omezenou bitovou hloubku jednotlivých barvových kanálů, proto se rozeznávají pouze rozsahy barvových složek (hodnoty v jednom rozsahu jsou považovány za shodnou úroveň barvové složky). Příklad rozsahů pro grafickou kartu EGA:

Rozsah Úroveň barvové složky
0–63 0
64–127 1
128–192 2
193–254 3

Testovací šestnáctibarevný obrázek uložený ve formátu PCX je uložen zde, tentýž obrázek, ovšem převedený do formátu PNG, je zobrazený níže.

pcx6

Obrázek 6: Šestnáctibarevný testovací obrázek (převedený do PNG)

Existují i šestnáctibarevné obrázky PCX uložené bez barvové palety. U těchto obrázků by se měla použít standardní šestnáctibarevná paleta programu, který obrázek vytvořil. V některých materiálech se můžeme dočíst, že standardní šestnáctibarevná paleta programu PC-PaintBrush obsahovala následující barvy (nicméně to nemohu na žádném souboru ověřit):

Index Barevné odstíny RGB
0 0 0 0
1 255 255 255
2 0 170 0
3 0 170 170
4 170 0 0
5 170 0 170
6 170 170 0
7 170 170 170
8 85 85 85
9 85 85 255
10 85 255 85
11 85 255 255
12 255 85 85
13 255 85 255
14 255 255 85
15 255 255 255

6. PCX a obrázky s 256 barvami

Obrázky s maximálně 256 barvami se začaly ve větší míře objevovat s nástupem grafických karet VGA (slavný mód 13h a různé X-módy) a později karet SVGA. Obrázky tohoto druhu, které jsou uloženy v jedné bitové rovině s osmi bity na pixel (Color planes=1, Bits per pixel=8), obsahují barvovou paletu, zde se však v plné míře ukazuje nedostatečně promyšlený návrh formátu PCX, protože v hlavičce souboru je rezervováno místo pouze pro 16 barev palety. Musel se tedy najít jiný způsob uložení. Ten spočívá v tom, že je barvová paleta uložena na konci souboru. Test, zda je zde grafická paleta skutečně uložena, spočívá v načtení 769 bytu od konce souboru (funkce fseek() umí počítat offsety i od konce, což je jistě výhodné). Pokud tento byte obsahuje hodnotu 0×c0, je barvová paleta přítomna a zbylých 768 bytů obsahuje 256 trojic hodnot RGB.

Aby vše nebylo tak jednoduché, existují i obrázky, které mají barvovou paletu kratší, typicky 64 nebo 128 položek. Je tedy nutné testovat i byte 193 (64×3+1) a 385 (128×3+1) od konce souboru. Co se stane v případě, že paleta není přítomna a náhodou je zrovna na pozicích 193, 385 či 769 od konce souboru uložena hodnota 0×c0 (součást rastru), specifikace PCX neřeší, takže je ještě zapotřebí při načítání obrázku provádět testy, kolik rastrových dat se opravdu načetlo a zda po načtení celého rastru zbývá v souboru oněch 193/385/769 bytů.

Testovací 256barevný obrázek vytvořený ve formátu PCX je uložen zde, tentýž obrázek, ovšem pro účely zobrazení v prohlížečích převedený do formátu PNG, je zobrazený níže.

pcx7

Obrázek 7: Obrázek s 256 barvami (převedený do PNG)

7. PCX a plnobarevné (truecolor) obrázky

Ve formátu PCX je možné ukládat i plnobarevné obrázky, tj. obrázky obsahující až 16 milionů barev. Kupodivu s nimi bývají menší problémy, než s obrázky 256barevnými. Je to z toho důvodu, že u plnobarevných obrázků není obsažena barvová paleta a není tedy nutné formát PCX „ohýbat“ ukládáním palety na nestandardní místa v souboru. Plnobarevné obrázky jsou ukládány do tří bitových rovin (Color planes=3), v každé bitové rovině je rezervováno osm bitů na pixel (Bits per pixel=8). Bitové roviny nejsou ukládány na sebou, ale prokládaně, tj. stylem:
1.bitová rovina ®, 1.řádek
2.bitová rovina (G), 1.řádek
3.bitová rovina (B), 1.řádek
1.bitová rovina ®, 2.řádek
2.bitová rovina (G), 2.řádek
3.bitová rovina (B), 2.řádek
1.bitová rovina ®, 3.řádek …

To znamená, že načítání není tak přímočaré, jak by se mohlo jevit a je zapotřebí použít pomocné buffery, typicky o délce jednoho obrazového řádku. Testovací plnobarevný obrázek vytvořený ve formátu PCX je uložen zde, tentýž obrázek, ovšem pro účely zobrazení v prohlížečích převedený do formátu PNG, je zobrazený níže.

CS24_early

pcx8

Obrázek 8: Plnobarevný obrázek (převedený do PNG)

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

V následující části tohoto seriálu dokončíme popis grafického formátu PCX. Ukážeme si, jakým způsobem je prováděna komprimace pomocí algoritmu RLE a také si předvedeme programové kódy určené pro čtení i zápis obrázků typu PCX.

Byl pro vás článek přínosný?

Autor článku

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