Programming Course in C# ¡Free!

PCX width and height

 Saturday, April 06, 2013 published by Exercises C#
Proposed exercise

Create a program that checks if a file seems a PCX image and, if so, show your width and height, from the following specification:

----

What is the PCX format?

The PCX format is used to store images. Is the company that designed format ZSoft to create your image manipulation program known as Paintbrush.


Internal details of a PCX file
A PCX file consists of the following parts: a header file, a bitmap header, a color table and bytes that define the image.

Specifically, the data forming the file header and the bitmap header are the following:

Head
Position Bytes Meaning
0 1 ID: must be 10
January 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.
February 1 Must be 1 to indicate RLE
January 3 bits per pixel
1 - Monochrome
4-16 colors
8 to 256 colors
24-16700000 color (true color, "truecolor")
August 4 Image Coordinates
Xmin, Ymin, Xmax, Ymax (4 data 2 bytes each)
February 12 horizontal resolution, in dots per inch
February 14 Vertical resolution in dots per inch
16 48 Colormap with the definition of the pallet in case of a 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 image (the image width, measured in bytes)
68 2 Information palette
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.

With these details we can find some information about the file. For example, to know the width from a program created for us, we should open the file, move to position 4 (counting from 0), two data read four bytes (a "int16" in the nomenclature used by many programming languages), which would Xmin, Ymin, Xmax, Ymax, and calculating: Width = Xmax - Xmin + 1, H = Ymax - Ymin + 1.

If the version number is 5, the color palette will be in the last 769 bytes of the file: First you get a value 12, then the R, G, B of the 256 colors in the palette (these values ​​are 0 255, should be divided by 4 if displayed on a VGA screen, because the RGB components of a VGA card only go from 0 to 63).

Images in 24-bit color (8 bits, 3 planes) bear palette for each point are stored components R, G, B.

Output



Solution


using System;
using System.IO;

public class ReaderPCX
{
public static void Main()
{
BinaryReader picture = new BinaryReader(File.Open("example.pcx", FileMode.Open));

byte b1 = picture.ReadByte();
if (b1 != 10)
Console.WriteLine("Format not valid");
else
{
picture.BaseStream.Seek(4, SeekOrigin.Begin);

short xMin = picture.ReadInt16();
short yMin = picture.ReadInt16();
short xMax = picture.ReadInt16();
short yMax = picture.ReadInt16();

Console.WriteLine("Width: " + ( xMax - xMin + 1));
Console.WriteLine("Height: " + ( yMax - yMin + 1));
}

picture.Close();
}
}