Ejercicio
Ancho y alto de PCX
Objetivo
Cree un programa que compruebe si un archivo parece una imagen PCX y, de ser así, muestre su ancho y alto, a partir de la siguiente especificación:
<---- ¿Qué es el formato PCX? <
El formato PCX se utiliza para almacenar imágenes. Es la empresa que diseñó el formato ZSoft para crear su programa de manipulación de imágenes conocido como Paintbrush.
Detalles internos de un archivo PCX Un archivo PCX consta de las siguientes partes: un archivo de encabezado, un encabezado de mapa de bits, una tabla de colores y bytes que definen la imagen.
Específicamente, los datos que forman el encabezado del archivo y el encabezado del mapa de bits son los siguientes:
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
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.
Con estos detalles podemos encontrar cierta información acerca del archivo. Por ejemplo, para conocer el ancho de un programa creado para nosotros, debemos abrir el archivo, pasar a la posición 4 (contando desde 0), dos datos leídos cuatro bytes (un "int16" en la nomenclatura utilizada por muchos lenguajes de programación), que sería Xmin, Ymin, Xmax, Ymax, y calculando: Ancho = Xmax - Xmin + 1, H = Ymax - Ymin + 1.
Si el número de versión es 5, la paleta de colores estará en los últimos 769 bytes del archivo: Primero se obtiene un valor 12, luego la R, G, B de los 256 colores de la paleta (estos valores son 0 255, deben dividirse por 4 si se muestran en una pantalla VGA, porque los componentes RGB de una tarjeta VGA solo van de 0 a 63).
Las imágenes en color de 24 bits (8 bits, 3 planos) llevan paleta para cada punto se almacenan componentes R, G, B.
Código de Ejemplo
// Import the necessary namespaces for file handling and basic input/output operations
using System;
using System.IO;
// Declare the main Program class
class Program
{
// Main method where the program starts
static void Main()
{
// Specify the path to the PCX image file
string filePath = "image.pcx"; // Replace this with the path to your PCX file
// Check if the file is a PCX image and display its width and height
try
{
// Open the PCX file using a BinaryReader to read the raw bytes
using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
{
// Read the first byte (ID), which must be 10 for a valid PCX file
byte id = reader.ReadByte();
if (id != 10) // Check if the ID is 10, which is required for PCX format
{
Console.WriteLine("This is not a valid PCX file.");
return; // Exit the program if the ID is not correct
}
// Skip the next 3 bytes (Version, Encoding, and Bits per Pixel) since we're not using them here
reader.BaseStream.Seek(3, SeekOrigin.Current);
// Read the coordinates (Xmin, Ymin, Xmax, Ymax) from position 4
reader.BaseStream.Seek(4, SeekOrigin.Begin);
ushort xmin = reader.ReadUInt16(); // Read Xmin (2 bytes)
ushort ymin = reader.ReadUInt16(); // Read Ymin (2 bytes)
ushort xmax = reader.ReadUInt16(); // Read Xmax (2 bytes)
ushort ymax = reader.ReadUInt16(); // Read Ymax (2 bytes)
// Calculate the width and height of the image
int width = xmax - xmin + 1; // Width = Xmax - Xmin + 1
int height = ymax - ymin + 1; // Height = Ymax - Ymin + 1
// Print the width and height of the PCX image
Console.WriteLine($"PCX Image Width: {width} pixels");
Console.WriteLine($"PCX Image Height: {height} pixels");
}
}
catch (Exception ex) // Catch any errors that may occur during file reading
{
// Print the error message to the console
Console.WriteLine($"Error reading the file: {ex.Message}");
}
}
}