home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 2
/
ctrom_ii_b.zip
/
ctrom_ii_b
/
C!T
/
C!T10_93
/
PCX
/
PCX.DOC
< prev
next >
Wrap
Text File
|
1993-08-10
|
9KB
|
158 lines
De PCX "Standaard"
Een beknopte beschrijving van het PCX-formaat.
Th.M. Hupkens
Inleiding
Een van de meest populaire formaten waarin digitale beelden kunnen
worden opgeslagen is het stokoude PCX-formaat. Oorspronkelijk werd dit
formaat gebruikt bij het tekenprogramma Paintbrush. De enige in dit
formaat toegestane compressie-methode is dan ook vooral geschikt om
tekeningen te comprimeren. Tegenwoordig wordt het PCX-formaat bijna
uitsluitend gebruikt voor ingescande foto's of gedigitaliseerde video
beelden. Hiervoor is het in wezen niet erg geschikt, omdat het compressie-
algoritme voor dit soort beelden meestal weinig efficiënt is. Dit geldt met
name voor de nieuwe 24 bits variant van het PCX-formaat: hier leidt de
"compressie" bijna altijd tot een aanzienlijke vergroting van het bestand!
Het PCX-formaat sloot in zijn oorspronkelijke vorm nauw aan bij de
eigenschappen van de toen beschikbare grafische adapters. Bij de ontwik-
keling van de PCX-standaard had men echter niet alle ontwikkelingen op dit
gebied voorzien, zodat sommige mogelijkheden van nieuwere grafische
kaarten later alleen nog met kunst- en vliegwerk in het formaat konden
worden ingebouwd. Daarnaast werden in de loop van de tijd nogal wat pro-
gramma's ontwikkeld voor het omzetten van plaatjes vanuit andere formaten
naar het PCX-formaat, waarbij men vaak (al dan niet noodgedwongen)
afwijkingen van het oorspronkelijk zeer strikte PCX-formaat toeliet. Er
bestaat waarschijnlijk geen ander grafisch formaat met zoveel niet of
nauwelijks gedocumenteerde varianten als het PCX-formaat. Een programma
dat alle mij bekende "PCX-bestanden" correct kan weergeven heb ik dan
ook niet kunnen vinden.
Beschrijving van het formaat
a Structuur van een PCX-bestand
Een PCX-bestand begint met een hoofdje ('header'). Dit bestaat uit 128
bytes. Hierin staat informatie die betrekking heeft op beeldtype en afmetin-
gen. De header kan worden opgevat als een record. Voor de overzichtelijk-
heid wordt dit in de vorm van een Pascal-achtig record gegeven:
Record PCX-Header
Identificatie, Versie: byte
Gecomprimeerd: boolean
BitsPerBeeldpunt: byte
XMin, YMin, XMax, YMax: integer
HorizontaleResolutie, VerticaleResolutie: integer
Kleuren: 16 x 3 bytes
Reserve: byte
AantalKleurVlakken: byte
AantalBytesPerLijn: integer
GrijsInformatie: integer
Gereserveerd: 58 bytes
Uitleg van de velden van PCX-Header:
- Identificatie: moet 10 zijn anders is het geen PCX-file.
- Versie: het versienummer van de PCX-definitie. Tot nu toe zijn
mogelijk:
0 (2.5)
2 (2.8 zonder kleurenpalet)
3 (2.8 met kleurenpalet)
4 (MS-Windows versie)
5 (3.0 'staartje' kleurenpalet kan aanwezig zijn)
Tussen haakjes staat de corresponderende versie van het tekenpro-
gramma Paintbrush.
- Gecomprimeerd: is altijd true (true = 1).
- BitsPerBeeldpunt: Aantal bits benodigd voor één beeldpunt, per
kleurenvlak.
- XMin, YMin, XMax, YMax: Geeft de positie en afmeting van het plaatje
(in scherm-coördinaten, m.a.w. in aantal beeldpunten). Omdat de plaats
van het oorspronkelijke beeld er niet toe doet worden XMin en YMin
meestal beide op nul gezet, waardoor XMax en YMax de Breedte-1 en
Hoogte-1 van het plaatje aangeven.
- HorizontaleResolutie, VerticaleResolutie: aantal beeldpunten per inch
(vaak geeft men hier echter het maximale aantal punten over de
breedte en hoogte van het gebruikte scherm).
- Kleuren: In dit array staat de instelling van maximaal 16 kleuren
(voor iedere kleur achtereenvolgens het rood-, groen-, en blauwaan-
deel, waarbij 0 overeenkomt met geen intensiteit en 255 met de
maximale intensiteit). Om de waarden te kunnen gebruiken moeten ze
bij gebruik van een VGA eerst door vier worden gedeeld en bij een
EGA door 64. De kleuren worden dus nauwkeuriger beschreven dan
nodig voor normale EGA's en VGA's.
- Reserve: wordt niet gebruikt maar moet niettemin 0 zijn.
- AantalKleurVlakken: Oorspronkelijk kwam dit getal overeen met het
aantal 'kleurvlakken' die door de betreffende grafische adapter
werkelijk werd gebruikt, maar kan nu het best worden opgevat als
het aantal lijnen dat men moet inlezen om de volledige kleurinformatie
te krijgen.
- AantalBytesPerLijn: Het aantal bytes per lijn en per kleurvlak in het
oorspronkelijke beeld. Er zijn PCX-bestanden die meer bytes per lijn
bevatten dan nodig gezien de breedte van het opgeslagen beeld.
- GrijsInformatie: Geeft aan of het een grijswaardenplaatje betreft of
niet:
1: geen grijswaarden (dus monochroom of kleur)
2: grijswaarden
Deze informatie is niet in alle versies beschikbaar.
- Gereserveerd: Wordt alleen in 'exotische' situaties gebruikt, kan
meestal genegeerd worden. Hiervan is mij geen documentatie bekend.
Na de header volgt het eigenlijke beeld in gecomprimeerde vorm.
Er kan maar één beeld worden opgeslagen. Alleen als het een 256-kleuren
beeld betreft komen na de gecomprimeerde data nog 769 bytes: eerst een
controle-byte (met de waarde 12), dan de 256 rood- groen- en blauwintensi-
teiten.
Nota bene. Bij de meer geavanceerde beeldschermen is er een indirect
verband tussen het getal dat de kleur aangeeft (het kleurnummer) en de
kleur die op het scherm zichtbaar wordt. Bij de EGA kan men het kleur-
nummer (0 t/m 15) koppelen aan elk van 63 mogelijke paletingangen (elk
met een vaste kleur). Bij de VGA kan het kleurnummer gekoppeld worden
aan elk van 255 mogelijke paletingangen, waarvan de kleur op zichzelf vrij
programmeerbaar is (de eerste stap is feitelijk overbodig, maar men heeft
dit zo gemaakt om de VGA compatibel te houden met de EGA).
b Beschrijving van het compressiealgoritme
In het PCX-formaat worden de beelden als volgt ge(de)codeerd:
De beelden worden (horizontaal) lijn voor lijn 'afgetast'. Indien er meer dan
één kleurvlak is, dan wordt elke lijn in zijn geheel in de achtereenvolgende
kleurvlakken afgetast voordat de eerstvolgende lagere lijn wordt genomen.
Als er meer dan twee naast elkaar gelegen bytes in een kleurvlak hetzelfde
zijn, dan wordt slechts één byte opgeslagen. Deze wordt in dat geval
voorafgegaan door een byte met daarin de herhalingsfactor. Om deze byte
te kunnen onderscheiden van een gewone byte worden de eerste twee bits
(de 'hoge' bits) op 1 gezet. De 6 overblijvende 'lage' bits vormen samen de
herhalingsfactor. Als de twee hoge bits niet 1 zijn dan betreft het een byte
die direct gebruikt kan worden. (Als in het oorspronkelijke beeld een byte
voorkomt waarvan de twee hoge bits al 1 zijn en deze byte bovendien niet
herhaald wordt dan moet noodgedwongen een extra byte worden gebruikt).
Als het aantal bits per beeldpunt gelijk is aan één dan worden van links
naar rechts over het scherm gaande steeds 8 beeldpunten samengenomen in
één byte. Als er meer dan één kleurvlak is dan kan het kleurnummer van
een beeldpunt berekend worden door overeenkomstige bits in elk kleurvlak
samen te stellen tot een getal. Bij het coderen is het echter niet nodig voor
elk beeldpunt het kleurnummer te bepalen: de vlakken kunnen rechtstreeks
uitgelezen worden en per vlak en per byte worden bewerkt. Indien de
juiste beeldschermadapter wordt gebruikt kan ook bij het decoderen recht-
streeks (per byte) naar de kleurvlakken worden geschreven, hetgeen een
enorme winst aan snelheid oplevert. Voor algemeen toepasbare viewers is
het echter handiger om wel het kleurnummer te berekenen.
In de 256 kleuren-mode wordt voor elk beeldpunt één byte gebruikt, hoe
zo'n byte intern over de kleurvlakken wordt verdeeld is in dat geval voor
het PCX-formaat niet relevant. Bij het 24-bits formaat wordt eveneens per
horizontale lijn van het beeldscherm gewerkt. Van elke lijn wordt eerst het
roodpercentage van alle punten afzonderlijk opgeslagen, dan van dezelfde
lijn het blauwpercentage en vervolgens het groenpercentage. Een percenta-
ge van 100% komt hierbij overeen met de waarde 255.
Voor niet genoemde combinaties van het aantal kleurvlakken en bits per
beeldpunt moeten de bits op voor de hand liggende wijze gecombineerd
worden.
Literatuur
1. Steve Rimmer Bit-Mapped Graphics Windcrest Books 1990
2. Th.M. Hupkens Van PCX-bestand naar plaatje op het beeldscherm
Blaise 20 (1992) p 191