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
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();
}
}