El formato de imagen PCX: Parte 1

El formato de imagen PCX: Parte 1


Imagen creada usando Gemini


Introducción

En un tiempo del pasado se utilizó mucho un formato de imagen conocido como PCX (.pcx) diseñado en la empresa ZSoft; era la época cuando reinaba en las PC de IBM el Windows 3.1, el cual venía con un programa de nombre Paintbrush para editar esa clase de archivos de imagen.

El formato de los archivos comentados llegó a ser tan popular que muchos diseñadores de videojuegos lo usaban (en su variante para imágenes de 256 colores) para elaborar los gráficos de sus productos, en tanto, en otros productos de la misma índole, entre ellos el conocido videojuego de estrategia en tiempo real Starcraft, también sirvió para guardar las capturas de pantalla.

En cambio en la actualidad, a diferencia de lo comentado antes, las imágenes ".pcx" casi no son utilizadas como resultado de las limitaciones de su formato, causadas estas en gran parte a su vez por todas las limitaciones tecnológicas de la época cuando fue elaborado.

En todo caso, y a pesar de lo dicho, estudiar el diseño de los archivos de imagen mencionados puede resultar interesante a los amantes de la retroinformática, y también puede ser de utilidad por otros motivos expuestos más adelante, por lo cual en este texto vamos a abordar ese tema con cierto detalle, si bien nos limitaremos a la variante de estos archivos para imágenes de 16 colores elaborada para el modo de pantalla de alta resolución del momento de 640x480 pixels.

En adición a lo dicho de estudiar la organización interna de los archivos PCX, vamos a escribir unas subrutinas en lenguaje de programación QuickBASIC para poner una de estas imágenes en la pantalla.

¿Qué utilidad podría tener este conocimiento?

En primer lugar podría mencionar una situación como la propia de cuando se desarrolla un sistema operativo y se necesita mostrar una imagen de bienvenida en pantalla en tanto se está llevando a cabo la carga del sistema en segundo plano.

En una situación similar, u otras parecidas, una imagen ".pcx" con los símbolos de las distintas letras del alfabeto también podría ser usada como si se tratara de una fuente para poner texto en pantalla estando en modo gráfico.

Pero según mi punto de vista, lo más conveniente de estudiar el formato de estos archivos de imagen es su simplicidad, lo cual lo hace ideal para comenzar a introducirse en este mundo de las imágenes digitales en la computadora, y a su vez propicia su utilidad en las otras situaciones mencionadas, por posibilitar la interpretación de los datos y puesta en pantalla de imágenes con sólo unas pocas líneas de código de programa.

En resumen, en esta parte del texto vamos a estudiar lo referente a la estructura interna de un PCX, y en otra entrega posterior los interesados podrán ver una implementación para interpretar las imágenes y descargarse el código en QuickBASIC 4.5.

Nota: Es necesario recordar solamente vamos a implementar código para interpretar imágenes ".pcx" de 16 colores lo cual se hace de una forma un poco diferente a cuando se necesita interpretar otras variantes de dichos archivos.


El formato de imagen PCX

Las imágenes en formato ".pcx" son imágenes de mapa de bits cual las imágenes BMP, JPEG, GIF, PNG, etc., pero como comenté un poco antes, con una organización interna mucho más simple en comparación con esos otros formatos de imagen mencionados.

En ellas por lo común se utiliza una paleta de colores para la representación de estos, como sucede con los GIF, y esta es la causa de la limitación de la cantidad de colores disponible con ese formato, por lo común no más de 256 a la vez.

En general la cantidad de colores varía según la profundidad de color soportada por cada variante de formato, y existen varias variantes de los archivos ".pcx" para 1, 2, 4, y 8 bits por pixel (BPP), esto es, para 2, 4, 16, y 256 colores respectivamente.

Pero además es necesario mencionar como entre todas las distintas variantes del formato PCX también podemos encontrarnos con una no indexada de 24 bits de profundidad de color, o sea, una variante donde no se utilizó una paleta de colores para representarlos, y por esto con ella se puede disponer de imágenes en color verdadero (True Color).

Nota: Las imágenes de mapa de bit guardan la información como una matriz de puntos de colores individuales conocidos como píxeles, los cuales, cuando son vistos en pantalla en sus posiciones relativas, nos permiten reconocer la forma representada en ellas; pero también existen los gráficos vectoriales, en los cuales a diferencia de en las imágenes de mapa de bits, se conforma la imagen por medio de una serie de cálculos matemáticos, y del llamado a las primitivas gráficas, primitivas estas casi siempre dependientes del sistema en donde se los ha creado.

En adición a lo dicho, por lo común el mapa de bit o zona de datos de los PCX está comprimida usando el algoritmo RLE (Run Length Encoding por sus siglas en inglés), lo cual se utiliza para la reducción de su tamaño en disco como mismo se lo hace en las imágenes en formato BMP de los Windows más modernos, y por eso mismo estudiar los PCX nos da la oportunidad de ir viendo cómo es ese procedimiento de compresión, y después estar más preparados cuando estudiemos un formato de imagen diferente en donde también se lo utilice.

En nuestro caso particular, como comenté, nos concentraremos en la variante o versión de 16 colores de los archivos ".pcx", y vamos hacerlo así por lo menos por tres motivos distintos (el último no es tan relevante):​

  1. La documentación para la versión de los PCX de 256 colores está mucho más extendida debido a lo comentado sobre su uso pasado en la realización de videojuegos.​

  2. La variante de formato de 4 bits de profundidad de color o 16 colores, se interpreta casi del mismo modo en comparación con la de 256 colores, aun cuando presenta un poco más de complicaciones durante ese proceso.​

  3. El entorno Microsoft QuickBASIC usado sólo dispone de una resolución de 320x200 píxeles en modo 13 (único con soporte para los 256 colores), en cambio tiene una resolución de 640x480 en modo 12 (donde los colores se ven limitados a 16), y por eso podemos disponer de más resolución con imágenes de 16 colores.​

En cuanto a su organización interna, un archivo ".pcx" consiste de forma general en una cabecera con la información necesaria para su decodificación, el mencionado mapa de bits o zona de datos donde se guarda la información de la imagen propiamente dicha, y una paleta de colores para 256 colores, todo esto en ese mismo orden dentro del archivo.

Nota: Las imágenes en formato PCX de 24 bits o color verdadero también existen, como he dicho en otra parte, y se representan como imágenes de 8 bits con planos de color diferentes para cada componente de los colores básicos.

Todo lo anterior, en unión a la posibilidad de usar o no la compresión (RLE), provoca todas esas variaciones del formato de archivo y por tanto las particularidades en cuanto a los pasos necesarios para interpretar la información de una imagen PCX, porque como es fácil suponer e insinué antes, no es exactamente lo mismo interpretar una imagen en un formato de 16 o de 256 colores, y esto se complica por lo mencionado sobre la compresión, haciendo necesario tener presente además si para la elaboración de la imagen se la usó (lo más común), o por el contrario no se la utilizó para nada.

Pero de todas formas las variaciones debidas a las distintas características de los archivos ".pcx" no son tan grandes, y por eso el procedimiento no cambia tanto como lo haría si se tratara de la interpretación de formatos de imagen diferentes.

En la paleta de colores en particular se almacenan los colores divididos en sus componentes RGB (Red Green Blue), sin embargo, no es así como se guardan los píxeles de la imagen en la zona de datos del archivo (salvo cuando se trata de una imagen en color verdadero), puesto en este caso se almacenan más bien los atributos de color o índices de la paleta de colores en la zona de datos, en vez de tener en ella las componentes de los colores primarios propiamente dichos.

En resumen, y para decirlo con más exactitud, los archivos de imagen ".pcx" están compuestos por una cabecera de 128 bytes, un área con un mapa de bits en donde se encuentran los atributos de color de cada pixel de la imagen (o las componentes de color en una imagen de 24 bits), región a la cual he llamado también zona de datos, y por último la paleta de colores para las tarjetas VGA comunes y corrientes en su época de gloria con las componentes RGB del color de cada atributo.

Nota: La paleta de colores del final del archivo sólo es usada para las imágenes de 8 bits o 256 colores, puesto las de 4 bits o 16 colores utilizan la paleta situada en la propia cabecera de éste, e ignoran por completo la colocada en la parte final en caso de estar incluida, lo cual no es lo más común.

La cabecera de 128 bytes es una estructura donde podremos encontrar toda la información de la imagen contenida en el archivo, salvo por la usada para representar la imagen como tal sobre la pantalla (puede variar un poco según la versión del PCX, aun cuando nada más su parte final), y sus componentes se muestran en la tabla expuesta a continuación:

Posición

Longitud (B)

Significado

Valor común

0

1

Identificador de archivo de imagen “.pcx”

0x0A (10 en decimal)

1

1

Versión

0x05 (Paintbrush v3.0

2

1

Codificado con RLE (1 = Sí)

0x01

3

1

Bits por pixel (BPP)

0x04 (0x08 256 colores)

4

2

XMin

0000

6

2

YMin

0000

8

2

XMax (Anchura – 1)

Ancho (pixeles)

10

2

YMax (Altura – 1)

Alto (pixeles)

12

2

Resolución horizontal

Pixeles x pulgada (DPI)

14

2

Resolución vertical

Pixeles x pulgada (DPI)

16

48

Paleta de colores EGA/VGA 16 colores

No usada con 256 colores

64

1

Sin uso

00

65

1

Planos de color

0x01

66

2

Bytes por línea

Depende de ancho y profundidad de color

68

2

Tipo de paleta (1 = Color/BN, 2 = Grises)

0x01

70

58

Sin uso

00

Nota: La información ha sido obtenida de CPV y coincide con otros datos dispersos en Internet en sitios ahora desaparecidos; "0x" es utilizado en lenguaje C para denotar un número en sistema hexadecimal, en un BASIC por el contrario los números en hexadecimal se denotarían con un "&H" delante.

En la tabla presentada antes, los valores con una longitud de 2 bytes son números enteros sin signo, y se almacenan en memoria con el formato conocido como punta delgada (Little Endian), un formato común en las microcomputadoras de IBM por sus procesadores Intel, lo cual significa en castellano que primero viene el byte de menor peso, y después se coloca el de mayor peso; así, un número de 16 bits en hexadecimal como el 20F4, se almacenaría en la memoria como F420 (cada dígito en hexadecimal se corresponde con 4 bits en binario), lo cual es una información importante si leemos la cabecera con un arreglo de 128 bytes individuales (como lo haremos) en vez de hacerlo con una estructura (QuickBASIC no tiene un tipo Integer sin signo), aun cuando no es necesario tenerlo en cuenta si esos números se leen como enteros con o sin signo, como se hace con una estructura (a pesar de no ser recomendable leerlos como enteros con signo puesto en algún momento podrían producirse errores de interpretación).

En cuanto a la información del mapa de bits de la imagen como tal, o como la he llamado antes, la zona de datos, se sitúa inmediatamente detrás de la cabecera del archivo antes comentada, por lo tanto, comienza a partir del byte 129 del ".pcx", y se extiende hasta donde está colocado un código 0x0C (número 12 en notación decimal), después del cual se encuentra la paleta de colores VGA (en las imágenes de 4 bits o de 16 colores, y también en las de color verdadero, no se encuentra colocado este código, como también he dicho por lo común tampoco se encontrará la paleta de 256 colores del final del archivo).

De todas formas, el tamaño del mapa de bits se puede calcular usando los valores correspondientes situados en la cabecera del archivo de la imagen, sin necesidad de tener en cuenta el código 0x0C, dispuesto nada más para más seguridad.

En nuestro caso, con una imagen con una profundidad de color de 4 bits, cada byte de atributo de color contendrá los atributos de color de 2 pixeles consecutivos en pantalla, en lugar de sólo uno, como sucede con las imágenes de 8 bits; pero por lo general esta parte del archivo está comprimida utilizando el algoritmo de compresión RLE mencionado antes, y por eso debemos tener ese dato en cuenta para poder interpretar correctamente cada byte del mapa de bits de la imagen.

Por último, después de la información de la imagen como tal, se coloca la paleta de colores VGA de un tamaño de 256 colores, y como cada color es guardado con sus componentes RGB, dicha paleta tendrá 768 bytes de información; es decir, si comenzamos a leer bytes desde el principio de la paleta, el primer bytes será el componente rojo, el segundo el componente verde, y el tercero el componente azul del primer atributo de color de la paleta de colores (índice 0); y en lo adelante sucederá lo mismo, y nos encontraremos los tres bytes consecutivos de las componentes RGB del segundo atributo de color de la paleta (índice 1), hasta completar los 256 atributos (índice 255) o 768 bytes de las componentes de color de la paleta.

Nota: La información contenida en cada byte de las componentes de color RGB está desplazada en 2 posiciones a la izquierda, por lo cual sus valores deben desplazarse 2 posiciones a la derecha antes de usarlos o cargar la paleta en la tarjeta de video; en este caso también podemos dividir los valores entre 4 si no disponemos de los operadores de desplazamiento a nivel de bits, como por cierto sucede en QuickBASIC y otros BASIC, puesto esa operación es igual a desplazar los bits de los valores en 2 posiciones a la derecha.

En cuanto al algoritmo de compresión RLE usado para reducir el tamaño del mapa de bits dentro del archivo de imagen PCX, en lo fundamental consiste en colocar la cantidad de veces en que se repiten los píxeles consecutivos de un mismo color delante del atributo de dicho color, en vez de repetir el atributo en cuestión muchas veces, o en guardar nada más el atributo de color del pixel a colocar en pantalla si dicho color no se repite de modo consecutivo.

Por lo anterior, para interpretar el mapa de bits o la zona de datos de la imagen PCX comprimida, será necesario distinguir dichos valores numéricos para la repetición de un atributo de color del pixel en pantalla, de los valores del atributo de color del pixel propiamente dicho.

En imágenes de 16 y de 256 colores (4 y 8 bits) el proceso de descompresión de los datos se hace del mismo modo, y consiste en comparar el valor leído del mapa de bits con el número 192 (este valor viene del método usado para distinguir un atributo de color de un número de repetición; en estos últimos, los 2 bits de mayor peso se establecen en 1, y debido a eso siempre son mayores a 192).

En caso de ser el byte leído un número superior a 192, se trata de un valor de repetición de un color y no de un atributo, y se deben tomar sus seis bits de menor peso (bits desde 0 a 5), y repetir el byte siguiente colocado en el mapa de bits como píxeles de color en pantalla tantas veces como el valor obtenido, no obstante, si el byte leído no es mayor de 192, el valor de repetición se asumirá como de 1, y el byte leído se corresponderá con el atributo de color como tal, por lo cual debe ponerse sólo 1 pixel de dicho color en la pantalla.

La relación de compresión conseguida con el método descrito puede llegar a ser de 3:2, o sea, el archivo comprimido tendría nada más un 66% del tamaño original.

Por supuesto, como comenté, el proceso a seguir es un poco más complicado en una imagen de 16 colores por causa de contener los bytes de los atributos de color 2 colores de 2 píxeles en vez de uno como sucede en las de 256 colores, y debido a eso es también levemente diferente una vez se ha identificado si un byte leído del mapa de bit del archivo es un atributo de color, sin embargo, como implementaremos esto en el código de demostración descargable en una parte posterior de este texto, no comentaré el procedimiento a seguir con más extensión en este punto del artículo, puesto todos podrán ver los detalles directamente en dicho código del programa fuente en caso de tener interés en estudiarlo, y en caso de necesidad o duda también podrán hacer una pregunta.

Por eso terminaré con la explicación para no extenderme mucho más, dado toda la información pertinente sobre el formato de los archivos ".pcx" ha sido expuesta en detalle, y para mostrar uno en pantalla sólo nos faltaría llevar todo lo comentado a código en un lenguaje capaz de ser corrido por una computadora, como lo haremos en nuestro caso para la variante de 16 colores con compresión.

Los interesados en ver la implementación en QuickBASIC para mostrar un PCX de 16 colores y utilizando compresión RLE centrado en la pantalla pueden referirse a la segunda parte cuando sea publicada.


¿Qué te ha parecido esta primera parte?

Tú participación aportando ideas, dando sugerencias, o expresando tu crítica constructiva a través de tus comentarios, es importante y fundamental para permitirnos crecer y crear contenidos con cada vez más calidad.

También es importante tu voto si crees vale la pena concederlo.

¡Nos vemos en la segunda parte de este artículo!



0
0
0.000
2 comments
avatar

Congratulations @retrotech-cuba! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s)

You published more than 10 posts.
Your next target is to reach 20 posts.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

0
0
0.000
avatar

Thanks for your contribution to the STEMsocial community. Feel free to join us on discord to get to know the rest of us!

Please consider delegating to the @stemsocial account (85% of the curation rewards are returned).

Consider setting @stemsocial as a beneficiary of this post's rewards if you would like to support the community and contribute to its mission of promoting science and education on Hive. 
 

0
0
0.000