Toby Opferman http://www.opferman.net programming@opferman.net How to display a 256 Colour PCX File PCX is the easiest compressed image data file there is to display. The format consists of a 128 Byte Header, The Compressed Image, 768 Byte pallete. The Header: The 128 Byte Header Consists of the following fields: OFFSET SIZE DESCRIPTION ______________________________ 0 1 Byte Manufacturer Of The File 1 1 Byte Version of PCX 2 1 Byte Type of Encoding (RLE Mostly) 3 1 Byte Number of Bits Per Pixel 4 2 Bytes Starting X location of Image 6 2 Bytes Starting Y location of Image 8 2 Bytes Width Of Image 10 2 Bytes Height Of Image 12 2 Bytes Horziontal DPI 14 2 Bytes Verticle DPI 16 48 Bytes Old EGA Pallete (Mostly Unused) 64 1 Byte RESERVED 65 1 Byte Number of Color Planes 66 2 Bytes Bytes Per Line 68 2 Bytes Pallete Type (1 = Color, 0 = Grey Scale) 70 58 Bytes Extra Padding Of course, this header can usually be ignored if you already know your data indefinate. Only reason to want to read this is if you want to check to make sure it's the right kind your reader will view or if you make a generic reader that will read any and all resolutions. Of course, if you're making this for a program, and you make the image yourself, you already know all the imformation you need and you can usually strip this 128 bytes off the file to save some space. Whether you skip this or not, we will move onto the Body of the PCX file. The Body is of unknown size. It uses RLE (Run Length Encoding), which will be explained here. RLE Coding is very simple compression. You read a Byte. If the byte is Less than 192, you plot it and increment your byte counter (When your byte counter is = to Height*Width of image, you are done). If it is >= 192, you take this byte and subtract 192 from it (Or and it with 63). Now, you read in the next byte. No matter what the second byte is, you plot it the number of times as the first byte & 63 or byte - 192 which ever you did. Also, add the count to the Byte Counter. Pseoudo Code: BYTECOUNTER IS 0 PLOT IMAGE: IS BYTECOUNTER = HEIGHT*WIDTH ? IF YES, THEN GO TO DONE READ IN A BYTE TO F PUT A ONE INTO PLOT_TIMES IS F < 192 ? IF YES, THEN GO TO PLOT IT PLOT_TIMES = F - 192 READ IN A BYTE TO F PLOT IT: PLOT F TO SCREEN PLOT_TIMES ADD PLOT_TIMES TO BYTECOUNTER GO TO PLOT IMAGE DONE: As you see, it's very simple. Next is the pallete. The pallete is 768 bytes at the end of the file, so you may want to go to the end of the file and seek -768. Each Byte is Multipled by 4 before it is put into the file. The bytes are stored Red, Green Blue. Here is simple Pseudo Code to read in the pallete: SEEK -768 BYTES FROM END OF FILE LET X BE 0 LOAD PALLETE: IS X = 256 ? IF YES THEN DONE READ ONE BYTE INTO Y DIVIDE Y BY 4 SET COLOR INDEX X RED TO Y READ ONE BYTE INTO Y DIVIDE Y BY 4 SET COLOR INDEX X GREEN TO Y READ ONE BYTE INTO Y DIVIDE Y BY 4 SET COLOR INDEX X BLUE TO Y ADD ONE TO X GO TO LOAD PALLETE DONE: Pretty simple stuff. Instead of using Divide, you may want to just shift right twice. And now you're ready to use PCX files in your code!