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 >
Text File  |  1993-08-10  |  9KB  |  158 lines

  1.                             De PCX "Standaard"
  2.               Een beknopte beschrijving van het PCX-formaat.
  3.                                Th.M. Hupkens
  4.  
  5.  
  6. Inleiding
  7.  
  8. Een van de meest populaire formaten waarin digitale beelden kunnen
  9. worden opgeslagen is het stokoude PCX-formaat. Oorspronkelijk werd dit
  10. formaat gebruikt bij het tekenprogramma Paintbrush. De enige in dit
  11. formaat toegestane compressie-methode is dan ook vooral geschikt om
  12. tekeningen te comprimeren. Tegenwoordig wordt het PCX-formaat bijna
  13. uitsluitend gebruikt voor ingescande foto's of gedigitaliseerde video
  14. beelden. Hiervoor is het in wezen niet erg geschikt, omdat het compressie-
  15. algoritme voor dit soort beelden meestal weinig efficiënt is. Dit geldt met
  16. name voor de nieuwe 24 bits variant van het PCX-formaat: hier leidt de
  17. "compressie" bijna altijd tot een aanzienlijke vergroting van het bestand!
  18.  
  19. Het PCX-formaat sloot in zijn oorspronkelijke vorm nauw aan bij de
  20. eigenschappen van de toen beschikbare grafische adapters. Bij de ontwik-
  21. keling van de PCX-standaard had men echter niet alle ontwikkelingen op dit
  22. gebied voorzien, zodat sommige mogelijkheden van nieuwere grafische
  23. kaarten later alleen nog met kunst- en vliegwerk in het formaat konden
  24. worden ingebouwd. Daarnaast werden in de loop van de tijd nogal wat pro-
  25. gramma's ontwikkeld voor het omzetten van plaatjes vanuit andere formaten
  26. naar het PCX-formaat, waarbij men vaak (al dan niet noodgedwongen)
  27. afwijkingen van het oorspronkelijk zeer strikte PCX-formaat toeliet. Er
  28. bestaat waarschijnlijk geen ander grafisch formaat met zoveel niet of
  29. nauwelijks gedocumenteerde varianten als het PCX-formaat. Een programma
  30. dat alle mij bekende "PCX-bestanden" correct kan weergeven heb ik dan
  31. ook niet kunnen vinden.
  32.  
  33. Beschrijving van het formaat
  34. a Structuur van een PCX-bestand
  35.  
  36. Een PCX-bestand begint met een hoofdje ('header'). Dit bestaat uit 128
  37. bytes. Hierin staat informatie die betrekking heeft op beeldtype en afmetin-
  38. gen. De header kan worden opgevat als een record. Voor de overzichtelijk-
  39. heid  wordt dit in de vorm van een Pascal-achtig record gegeven:
  40.  
  41. Record PCX-Header
  42.       Identificatie, Versie: byte
  43.       Gecomprimeerd: boolean 
  44.       BitsPerBeeldpunt: byte
  45.       XMin, YMin, XMax, YMax: integer
  46.       HorizontaleResolutie, VerticaleResolutie: integer
  47.       Kleuren: 16 x 3 bytes
  48.       Reserve: byte
  49.       AantalKleurVlakken: byte
  50.       AantalBytesPerLijn: integer
  51.       GrijsInformatie: integer
  52.       Gereserveerd: 58 bytes
  53.  
  54. Uitleg van de velden van PCX-Header:
  55. -     Identificatie: moet 10 zijn anders is het geen PCX-file.
  56. -     Versie: het versienummer van de PCX-definitie. Tot nu toe zijn
  57.       mogelijk:
  58.         0 (2.5)
  59.         2 (2.8 zonder kleurenpalet)
  60.         3 (2.8 met kleurenpalet)
  61.         4 (MS-Windows versie)
  62.         5 (3.0 'staartje' kleurenpalet kan aanwezig zijn)
  63.       Tussen haakjes staat de corresponderende versie van het tekenpro-
  64.       gramma Paintbrush.
  65. -     Gecomprimeerd: is altijd true (true = 1).
  66. -     BitsPerBeeldpunt: Aantal bits benodigd voor één beeldpunt, per
  67.       kleurenvlak. 
  68. -     XMin, YMin, XMax, YMax: Geeft de positie en afmeting van het plaatje
  69.       (in scherm-coördinaten, m.a.w. in aantal beeldpunten). Omdat de plaats
  70.       van het oorspronkelijke beeld er niet toe doet worden XMin en YMin
  71.       meestal beide op nul gezet, waardoor XMax en YMax de Breedte-1 en
  72.       Hoogte-1 van het plaatje aangeven.
  73. -     HorizontaleResolutie, VerticaleResolutie: aantal beeldpunten per inch
  74.       (vaak geeft men hier echter het maximale aantal punten over de
  75.       breedte en hoogte van het gebruikte scherm).
  76. -     Kleuren: In dit array staat de instelling van maximaal 16 kleuren
  77.       (voor iedere kleur achtereenvolgens het rood-, groen-, en blauwaan-
  78.       deel, waarbij 0 overeenkomt met geen intensiteit en 255 met de
  79.       maximale intensiteit). Om de waarden te kunnen gebruiken moeten ze
  80.       bij gebruik van een VGA eerst door vier worden gedeeld en bij een
  81.       EGA door 64. De kleuren worden dus nauwkeuriger beschreven dan
  82.       nodig voor normale EGA's en VGA's.
  83. -     Reserve: wordt niet gebruikt maar moet niettemin 0 zijn.
  84. -     AantalKleurVlakken: Oorspronkelijk kwam dit getal overeen met het
  85.       aantal 'kleurvlakken' die door de betreffende grafische adapter
  86.       werkelijk werd gebruikt, maar kan nu het best worden opgevat als
  87.       het aantal lijnen dat men moet inlezen om de volledige kleurinformatie
  88.       te krijgen.
  89. -     AantalBytesPerLijn: Het aantal bytes per lijn en per kleurvlak in het
  90.       oorspronkelijke beeld. Er zijn PCX-bestanden die meer bytes per lijn
  91.       bevatten dan nodig gezien de breedte van het opgeslagen beeld.
  92. -     GrijsInformatie: Geeft aan of het een grijswaardenplaatje betreft of
  93.       niet:
  94.       1: geen grijswaarden (dus monochroom of kleur)
  95.       2: grijswaarden
  96.       Deze informatie is niet in alle versies beschikbaar.
  97. -     Gereserveerd: Wordt alleen in 'exotische' situaties gebruikt, kan
  98.       meestal genegeerd worden. Hiervan is mij geen documentatie bekend.
  99.  
  100. Na de header volgt het eigenlijke beeld in gecomprimeerde vorm.
  101. Er kan maar één beeld worden opgeslagen. Alleen als het een 256-kleuren
  102. beeld betreft komen na de gecomprimeerde data nog 769 bytes: eerst een
  103. controle-byte (met de waarde 12), dan de 256 rood- groen- en blauwintensi-
  104. teiten.
  105.  
  106. Nota bene. Bij de meer geavanceerde beeldschermen is er een indirect
  107. verband tussen het getal dat de kleur aangeeft (het kleurnummer) en de
  108. kleur die op het scherm zichtbaar wordt. Bij de EGA kan men het kleur-
  109. nummer (0 t/m 15) koppelen aan elk van 63 mogelijke paletingangen (elk
  110. met een vaste kleur). Bij de VGA kan het kleurnummer gekoppeld worden
  111. aan elk van 255 mogelijke paletingangen, waarvan de kleur op zichzelf vrij
  112. programmeerbaar is (de eerste stap is feitelijk overbodig, maar men heeft
  113. dit zo gemaakt om de VGA compatibel te houden met de EGA).
  114.  
  115. b Beschrijving van het compressiealgoritme
  116.  
  117. In het PCX-formaat worden de beelden als volgt ge(de)codeerd: 
  118.  
  119. De beelden worden (horizontaal) lijn voor lijn 'afgetast'. Indien er meer dan
  120. één kleurvlak is, dan wordt elke lijn in zijn geheel in de achtereenvolgende
  121. kleurvlakken afgetast voordat de eerstvolgende lagere lijn wordt genomen.
  122. Als er meer dan twee naast elkaar gelegen bytes in een kleurvlak hetzelfde
  123. zijn, dan wordt slechts één byte opgeslagen. Deze wordt in dat geval
  124. voorafgegaan door een byte met daarin de herhalingsfactor. Om deze byte
  125. te kunnen onderscheiden van een gewone byte worden de eerste twee bits
  126. (de 'hoge' bits) op 1 gezet. De 6 overblijvende 'lage' bits vormen samen de
  127. herhalingsfactor. Als de twee hoge bits niet 1 zijn dan betreft het een byte
  128. die direct gebruikt kan worden. (Als in het oorspronkelijke beeld een byte
  129. voorkomt waarvan de twee hoge bits al 1 zijn en deze byte bovendien niet
  130. herhaald wordt dan moet noodgedwongen een extra byte worden gebruikt).
  131.  
  132. Als het aantal bits per beeldpunt gelijk is aan één dan worden van links
  133. naar rechts over het scherm gaande steeds 8 beeldpunten samengenomen in
  134. één byte. Als er meer dan één kleurvlak is dan kan het kleurnummer van
  135. een beeldpunt berekend worden door overeenkomstige bits in elk kleurvlak
  136. samen te stellen tot een getal. Bij het coderen is het echter niet nodig voor
  137. elk beeldpunt het kleurnummer te bepalen: de vlakken kunnen rechtstreeks
  138. uitgelezen worden en per vlak en per byte worden bewerkt. Indien de
  139. juiste beeldschermadapter wordt gebruikt kan ook bij het decoderen recht-
  140. streeks (per byte) naar de kleurvlakken worden geschreven, hetgeen een
  141. enorme winst aan snelheid oplevert. Voor algemeen toepasbare viewers is
  142. het echter handiger om wel het kleurnummer te berekenen.
  143. In de 256 kleuren-mode wordt voor elk beeldpunt één byte gebruikt, hoe
  144. zo'n byte intern over de kleurvlakken wordt verdeeld is in dat geval voor
  145. het PCX-formaat niet relevant. Bij het 24-bits formaat wordt eveneens per
  146. horizontale lijn van het beeldscherm gewerkt. Van elke lijn wordt eerst het
  147. roodpercentage van alle punten afzonderlijk opgeslagen, dan van dezelfde
  148. lijn het blauwpercentage en vervolgens het groenpercentage. Een percenta-
  149. ge van 100% komt hierbij overeen met de waarde 255.
  150. Voor niet genoemde combinaties van het aantal kleurvlakken en bits per
  151. beeldpunt moeten de bits op voor de hand liggende wijze gecombineerd
  152. worden.
  153.  
  154. Literatuur
  155.  
  156. 1.    Steve Rimmer Bit-Mapped Graphics Windcrest Books 1990
  157. 2.    Th.M. Hupkens Van PCX-bestand naar plaatje op het beeldscherm
  158.       Blaise 20 (1992) p 191