|
|||||||||||||||||||||||||||||
PCXTento formát pochádza v dielne firmy PC Paintbrush a z tohto dôvodu sa niekedy označuje aj ako PC Paintbrush formát. Posledná verzia tohto formátu umožňuje ukladanie až 24-bitových obrázkov. Dáta môžu byť uložené s orientáciou na farebné plochy (roviny) alebo na body (aby v čase je vzniku vyhovoval hardvérovému návrhu obrazovky IMB EGA alebo IMB VGA). Obrazové dáta sú kódované použitím varianty RLE algoritmu, ktorý je rýchly, ale na druhej strane nie veľmi účinný. Pri RLE kompresii je pomerne ťažko určiť priemernú alebo obvyklú kompresiu, pretože táto kompresia je vo veľkej miere závislá od kódovaných dát. Organizácia súboruSúbor PCX je organizovaný do troch hlavných častí: hlavička, obrazové dáta a farebná paleta. Farebná paleta obsahuje obvykle 256 farieb. Hlavička
typedef sturct _PcxHeader {
BYTE Identifier; /* Indentifikátor PCX, vždy 0x0A */
BYTE Version /* Číslo verzie */
BYTE Encoding; /* Druh kódovania */
BYTE BitsPerPixel; /* Počet bitov na bod */
WORD XStart; /* Ľavá strana obrázku */
WORD YStart; /* Horná strana obrázku */
WORD XEnd; /* Pravá strana obrázku */
WORD YEnd; /* Spodná strana obrázku */
WORD HorzRes; /* Horizontálne rozlíšenie */
WORD VertRes; /* Vertikálne rozlíšenie */
BYTE Patette[48]; /* 16 farebná EGA paleta */
BYTE Reserved1; /* Vyhradené */
BYTE NumBitPlane; /* Počet bitových rovín */
WORD BytesPerLine; /* Počet bajtov na skanovací riadok */
WORD PaletteType; /* Typ palety */
WORD HorzScreenSize; /* Horizontálna veľkosť obrazovky */
WORD VertScreenSize; /* Vertikálna veľkosť obrazovky */
BYTE Reserved[54]; /* Rezervované */
} PCXHEAD;
Paleta16-farebná EGA paletaPrvé verzie PCX nepodporovali modifikovateľnú paletu. Neskôr sa objavili ďalšie dve verziu PCX formátu. Jedna s informáciou o palete (modifikovateľná paleta) a jedna bez paletovej informácie.
EGA paleta je 48-bajtové pole obsahujúce 16 RBG trojíc, s hodnotami v rozmedzí 0-255. Z tohto pola je
podľa potreby vyplnených iba potrebné množstvo údajov, zvyšné sú nastavené na EgaColorRed = EgaPalette[0] >> 6; EgaColorGreen = EgaPalette[1] >> 6; EgaColorBlue = EgaPalette[2] >> 6; /* atď */ 4-farebná CGA paleta
EGA paleta môže byť použitá aj pre zobrazovanie CGA obrázkov. Tri farby slúžia ako farba popredia a
jedna farba slúži ako farba pozadia. Najvýznamnejšie štyri bity prvého bajtu EGA palety určujú farbu
pozadia v rozmedzí 0 - 15. Najvýznamnejšie tri bity štvrtého bajtu EGA palety obsahujú farbu popredia.
Tri bity farby popredia korešpondujú s nastavením CgaBackGroundColor = EgaPalete[0] 4; CgaColorBurstEnable = (EgaPalette[3] & 0x80) >> 7; CgaColorBurstEnable = (EgaPalette[3] & 0x40) >> 6; CgaColorBurstEnable = (EgaPalette[3] & 0x20) >> 5; 256-farebná VGA paleta
VGA technológia vyberá 256 farieb z 262 144 možných. Keďže v hlavičke súboru nebolo dostatok miesta, bola informácia
o VGA palete pridaná na koniec súboru. Keďže veľkosť obrazových dát nie je vždy rovnaká, nie je poloha palety
určovaná vzhľadom na začiatok súboru ale jeho koniec. Aby sme zistili, či je VGA plate uložená v súbore, treba sa posunúť
769 bajtov od konca súboru. Ak sa tam nachádza hodnota VGA paleta obsahuje 3x256 bajtov v rozmedzí 0-255. VGA zariadenia vedia pracovať iba s hodnotami 0-63 pre každú farebnú zložku, takže každá hodnota musí byť delená štvormi (posun o dva bity doprava). Obrazové dáta
Na kódovanie obrazových dát za používa modifikovaný RLE algoritmus. Kódované dáta sa čítajú po jednom bajte.
Ak sú dve najvýznamnejšie bity nastavené na
Pokiaľ sú obe najvýznamnejšie bity nastavené na Toto kódovanie nie je veľmi ideálne. Jednobajtová hodnota paketu môže obsahovať iba čísla v rozmedzí 0-63. Ak sa hodnota nachádza mimo tohto rozsahu, je nutné použiť dvojbajtovú variantu paketu. Toto môže mať za následok negatívnu kompresiu. Dekódovanie PCX súboruAby sme boli schopní dekódovať PCX súbor, musíme si z hlavičky zistiť aspoň tieto informácie.
ImageWidth = XEnd - XStart + 1; ImageHeight = YEnd - YStart + 1; ScanLineLength = NumBitPlane * BytesPerLine;Dĺžka výplne každého skanovacieho riadka bude hodnota LinePaddingSize.
LinePaddingSize = ((BytesPerLine * NumBitPlane) * (8/BitsPerPixel)) - ((XEnd - XStart) + 1)Pri dekódovaní predpokladajme, že máme bufer veľkosti skanovacieho riadku. Potom dekódovací algoritmus bude nasledovný:
|
|||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||