Ejercicio
Ancho Y Alto De PCX
Objectivo
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.
Ejemplo Ejercicio C#
Mostrar Código C#
// 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}");
}
}
}
Salida
A PCX file called image.pcx with the following structure (simplified for illustration):
The first byte is 10, indicating it’s a PCX file.
After skipping some bytes (for version, encoding, etc.), we read the coordinates xmin, ymin, xmax, ymax to calculate the image dimensions.
The program will read this file and print the following output:
PCX Image Width: 200 pixels
PCX Image Height: 150 pixels
Example Error Handling:
Error reading the file: The system cannot find the file specified.
Código de Ejemplo Copiado!
Comparte este Ejercicio C# Sharp