PPPPP CCCC X X
P P C C X X
P P C X X
PPPPP C X
P C X X
P C C X X
P CCCC X X
PCX FORMÁT
PCX je sice jeden z nejrozšířenějších grafických formátů, ale
když jsem o něm sháněl, informace tak jich moc nebylo, a proto se
s vámi chci podělit o své zkušenosti.
Jako většina formátu má na svém začátku hlavičku. U PCXka je
128bytová, ale je využito jen 74 bytů (autoři ji chtěli asi
rozšířit).
Byte | Velikost | Popis/poznámky
-----+-----------+-------------------------------------------
0 | 1 | Konstantně 10 = ZSoft.pcx
1 | 1 | Informace o versi
| | 0 = Verse 2.5 PC Paintbrush
| | 2 = Verse 2.8
| | 3 = Verse 2.8
| | 4 = Verse 3.0 PC Paintbrush
| | pro Wokna
| | 5 = Verse 3.0
| | (nejrozšířenější)
2 | 1 | 1 = .PCX
3 | 1 | počet Bytů na pixel
| | (1, 2, 4, nebo 80
4 | 8 | Rozměry: XMin,YMin,XMax,YMax
12 | 2 | Horizontální rozlišení v DPI
14 | 2 | Vertikální rozlišení v DPI
16 | 48 | Paleta (jen pro méně než 16
| | barev)
64 | 1 | Reservováno
65 | 1 | Počet plánů barev(u obrazů s více než 256 barvami)
66 | 2 | Bytů na řádek
68 | 2 | Jak se má paleta interpretovat
| | 1 = Barevně
| | 2 = Odstíny šedi
70 | 2 | Horizontální velikost obrazu v bodech
72 | 2 | Vertikální velikost obrazu v bodech
74 | 54 | Vyplňuje na 128 Bytů
DPI = dots per inch (bodů na palec)
Ale na obrázku jsou nejdůležitější obrazová data. V PCX jsou
komprimována tak, že když jsou horní dva bity = 1 tak ostatních 6
bitů určuje kolikrát bude použit další byte. Máte-li na obrázku velké
úseky stejné barvy, je tato komprese účinná. Problémy nastanou pro
barvy s číslem větším než 192, ty potom totiž zabírají dvakrát více
místa.
Takhle nějak může vypadat rutinka na přečtení barvy
ch=readz(f); //čte znak
cou=1; //nastavuje počet opakování na 1
if (0xC0==(0xC0 & ch)){ //testuje horní dva bity 0xC0 = 11000000
cou=0x3F & ch; //kopíruje dolních 6 bitů do cou
ch=readz(f); //načítá další znak do informace o barvě
}
Vysvětlivky : cou - počet opakování
ch - informace o barvě
readz - čte znak
& - bitový AND
Další důležitou částí je paleta. Pro obrázky s více než 16
barvami je uložena na konci souboru, a to 3*PocBarev od konce souboru
(nejčastěji 256*3=678). Je-li paleta 16. barevná je uložena v
hlavičce souboru
A to jest vše. Přikládám zde program, který načte 256 barevný
obrázek (do 320*200 bodů) a zobrazí
jej. (Omlouvám se za některé prasárny, ale lepší už to asi nebude)
Upozornění k programu:
a) psal jsem ho já, takže není jistý, jestli bude
fungovat
b) nebyl důkladně testován takže viz. a)
c) funguje jen pro 256barevný soubor
d) v Borland C++ 3.0 lze určitě zkompilovat
e) je v C++ protože Pascal už neumim
f) máte-li dotazy či poznámky, posílejte je do
redakce na známou adresu.
HIPP
(informace přejaty z "ZSoft PCX File Format Technical Reference
Manual)
(omlouvám se za krátkost článku, ale PCXko je opravdu jednoduchý)
výheň