Exercise
PCX width and height
Objetive
Create a program that checks if a file is a PCX image and, if so, displays its width and height using the following specification:
What is the PCX format?
The PCX format is used for storing images. It was created by ZSoft, the company behind the Paintbrush image manipulation program.
Internal details of a PCX file
A PCX file consists of the following parts: a file header, a bitmap header, a color table, and the bytes that define the image. The data forming the file header and the bitmap header are as follows:
Header Position Bytes Meaning
0 1 ID: must be 10
1 1 PCX File Version
0 = Version 2.5
2 = Version 2.8 with Palette
3 = Version 2.8 default palette
4 = Paintbrush for Windows
5 = Version 3.0 or higher, with the end of file palette.
2 1 Must be 1 to indicate RLE
3 1 Bits per pixel
1 - Monochrome
4-16 colors
8 to 256 colors
24-16700000 color (true color, "truecolor")
4 8 Image Coordinates
Xmin, Ymin, Xmax, Ymax (4 data 2 bytes each)
12 2 Horizontal resolution, in dots per inch
14 2 Vertical resolution, in dots per inch
16 48 Color map with the definition of the palette in case of 16 or fewer colors. Organized in fields of 16 bytes * 3.
64 1 Reserved
65 1 Number of planes (4 to 16 colors, 3-bits for RGB -24)
66 2 Bytes per line of image (the image width, measured in bytes)
68 2 Palette information
1 = Color
2 = Grayscale
70 2 Screen width (only used by Paintbrush IV and above)
72 2 Screen height (only used by Paintbrush IV and above)
74 54 bytes of padding, to complete 128 bytes of header. All bytes should be 0.
Using these details, we can find information about the file. For example, to determine the width and height of the image, we should open the file, move to position 4 (counting from 0), and read the four bytes that represent Xmin, Ymin, Xmax, and Ymax. Then we can calculate the width and height as follows: Width = Xmax - Xmin + 1, Height = Ymax - Ymin + 1.
If the version number is 5, the color palette will be in the last 769 bytes of the file. First you will find a value of 12, then the RGB values of the 256 colors in the palette. If these values are displayed on a VGA screen, they should be divided by 4 because the RGB components of a VGA card only go from 0 to 63.
Images in 24-bit color (8 bits, 3 planes) have a palette for each point that stores the components R, G, and B.
Example Code
public class Main
{
public static void main(String[] args)
{
BinaryReader myFile;
myFile = new BinaryReader(File.Open("1.pcx", FileMode.Open));
byte mark = myFile.ReadByte();
if (mark != 10)
{
System.out.println("Not a PCX file!");
}
else
{
myFile.BaseStream.Seek(4, SeekOrigin.Begin);
short xMin = myFile.ReadInt16();
short yMin = myFile.ReadInt16();
short xMax = myFile.ReadInt16();
short yMax = myFile.ReadInt16();
System.out.println("Width: " + (xMax - xMin + 1));
System.out.println("Height: " + (yMax - yMin + 1));
}
myFile.Close();
}
}