Mostrar/Ocultar TOC

Tabla de Contenidos del Libro
Prefacio
Capítulo 1: Introducción
Capítulo 2: Fundamentos
Capítulo 3: Mapas de Bits
Capítulo 4: Archivos Vectoriales
Capítulo 5: Metaarchivos
Capítulo 6: Dependencias de Plataforma
Capítulo 7: Conversión de Formatos
Capítulo 8: Trabajando con Archivos Gráficos  
Capítulo 9: Compresión
Capítulo 10: Multimedia
Formato: Adobe Illustrator
Formato: Adobe Photoshop
Formato: Atari ST
Formato: AutoCAD DXF
Formato: Autodesk 3D Studio
Formato: BDF
Formato: BRL-CAD
Formato: BUFR
Formato: CALS Raster
Formato: CGM
Formato: CMU
Formato: DKB
Formato: Dore Raster
Formato: DPX
Formato: Dr. Halo
Formato: DVM Movie
Formato: PostScript Encapsulado
Formato: FaceSaver
Formato: FAX
Formato: FITS
Formato: FLI
Formato: GEM Raster
Formato: GEM VDI
Formato: GIF
Texto en Inglés del Capítulo 2
Imagen del CD-ROM de la 2° Edición
Imagen del CD-ROM de la 1° Edición (Torrent y HTTPS)
Versión Hipertexto del CD-ROM de la 2° Edición (En Inglés)
Versión Hipertexto del CD-ROM de la 2° Edición (En Ruso)

Capítulo 2 — Fundamentos de Gráficos de Computadoras

Capítulo 2 — Fundamentos de Gráficos de Computadoras

Para entender los formatos de archivo gráficos, necesitas algún conocimiento general sobre gráficos de computadora. Por supuesto, los gráficos de computadora son un tema enorme, y no podemos esperar hacerle justicia aquí. En general, asumimos en este libro que no eres un novato en esta area. Sin embargo, para aquellos que no tienen un conocimiento general extensivo sobre gráficos de computadora, este capítulo debería ser útil para explicar la terminología que necesitarás para entender las discusiones de los formatos encontradas más adelante en este libro.

Si estás interesado en explorar cualquiera de estos temas adicionalmete, en total el mejor texto es Computer Graphics: Principles and Practices, por James D. Foley, Andries van Dam, S.K. Feiner, y J.F. Hughes. Esta es la segunda edición del libro conocido anteriormente a lo largo de la industria como “Foley y van Dam”. Encontrarás referencias adicionales en la sección "Para Mayor Información" al final de este capítulo.



Pixeles y Coordenadas

Las ubicaciones en los gráficos de computadora se almacenan como coordenadas gráficas, pero la superficie de display de un dispositivo de salida es un objeto físico en cuestión. Por lo tanto, es importante tener en mente la distinción entre pixeles físicos y pixeles lógicos.

Pixeles Físicos

Son los puntos en cuestión desplegados en un dispositivo de salida. Cada uno toma una pequeña porción de espacio en la superficie del dispositivo. Los pixeles físicos son manipulados directamente por el hardware de display y forman los elementos independientemente programables más pequeños en la superficie de salida. Eso es lo ideal, después de todo. En la práctica, sin embargo, el hardware de salida puede yuxtaponerse o agrupar varios puntos más pequeños para formar un pixel individual. Esto es cierto en el caso de la mayoría de dispositivos análogos CRT a color, los cuales usan varios puntos de color diferente para desplegar lo que el ojo, a una distancia visual normal, percibe como un único, uniformemente coloreado, pixel.

Ya que los pixeles físicos cubren un área fija en la superficie de salida, hay límites prácticos para cuán cercanos pueden estar dos pixeles. Pedirle al hardware de salida que provea una resolución demasiado alta — demasiados pixeles en una superficie de salida dada — creará borrosidad y otra deterioración de la calidad de la imagen si los pixeles adyacentes se traslapan o colisionan.

Pixeles Lógicos

En contraste a los pixeles físicos, los pixeles lógicos son como puntos matemáticos: especifican una ubicación, pero se asumen que no ocupan área. Por lo tanto, el mapeo entre valores de pixeles lógicos en los datos de mapa de bits y los pixeles físicos en la pantalla debe tomar en cuenta el tamaño en cuestión y la disposición de los pixeles físicos. Un mapa de bits denso y brillantemente coloreado, por ejemplo, puede perder su vibrancia cuando se despliega en un monitor demasiado grande, porque los pixeles deben dispersarse para cubrir la superficie.

La figura 2-1 ilustra la diferencia entre pixeles lógicos y físicos.

Figura 2-1: Pixeles lógicos y físicos
FIGURA 2-1: Pixeles lógicos y físicos

Profundidad de Pixel y Pantallas

El número de bits en un valor usado para representar un pixel gobierna el número de colores que el pixel puede exhibir. Entre más bits por pixel, mayor el número de posibles colores. Más bits por pixel también significa que se necesita más espacio para almacenar los valores de pixel que representan un mapa de bits que cubre un área dada en la superficie de un dispositivo de pantalla. A medida que la tecnología ha evolucionado, los dispositivos de display que manejan más colores han estado disponibles a menor costo, lo cual a alimentado una demanda en aumento de espacio de almacenamiento.

La mayoría de dispositivos de salida modernos pueden desplegar entre dos y más de 16 millones de colores simultáneamente, correspondientes a entre 1 y 24 bits de almacenamiento por pixel, respectivamente. Las pantallas bi-nivel o de 1 bit usan 1 bit de valor de información de pixel para representar cada pixel, los cuales pueden tener dos estados de color. Las pantallas de 1 bit más comunes son monitores monocromáticos e impresoras blanco y negro, por supuesto. Las cosas que se reproducen bien en blanco y negro — dibujos de líneas, texto, y algún tipo de clip art — usualmente se almacenan como datos de 1 bit.

Un Poco Sobre Color Verdadero


La gente a veces dice que el ojo humano puede discriminar entre 224 colores (16,777,216), aunque muchos menos colores pueden percibirse simultáneamente. Naturalmente hay mucho desacuerdo sobre esta figura, y el número en cuestión ciertamente varía de persona a persona y bajo diferentes condiciones de iluminación, salud, genética y atención. En cualquier caso, cada uno de nosotros puede discriminar entre un gran número de colores, ciertamente más de unos pocos miles. Se dice que un dispositivo capaz de igualar o exceder el poder de resolución de color del ojo humano bajo la mayoría de condiciones, despliega color verdadero. En la práctica, esto significa 24 bits por pixel, pero por razones históricas, los dispositivos de salida capaces de desplegar 215 o 216 colores (65,535) también han sido llamados incorrectamente de color verdadero.

Más recientemente, el término hicolor ha llegado a ser usado para dispositivos capaces de manejar hasta 215 o 216 colores. Fullcolor es un término usado principalmente en mercadeo; su significado es mucho menos claro. (¡Si descubres lo que significa exactamente, por favor háznoslo saber!)

Problemas con el Despliegue de Color

Es el caso frecuentemente que el número o conjunto de colores definidos por los valores de pixeles almacenados en un archivo, difiere de aquellos que pueden desplegarse en la superficie de un dispositivo de salida. Entonces depende de la aplicación de renderizado el traducir entre los colores definidos en el archivo y aquellos que se esperan por el dispositivo de salida. Generalmente no hay problema cuando el número de colores definido por los valores de pixel encontrados en el archivo (fuente) es mucho menor al del número que puede desplegarse en el dispositivo de salida (destino). La aplicación de renderización en este caso es capaz de elegir entre lo colores de destino para ofrecer una concordancia para cada color de la fuente. Pero ocurre un problema cuando el número de colores definidos por los valores de pixeles excede el número que puede desplegarse en un dispositivo de salida. Considera los siguientes ejemplos.

En el primer caso, los datos de 4 bits por pixel (que corresponden a 16 colores) están siendo desplegados en un dispositivo capaz de soportar datos de 24 bits (que corresponden a más de 16 millones de colores). El dispositivo de salida es capaz de desplegar sustancialmente más colores de los que se necesitan para reproducir la imagen definida en el archivo. Así, los colores en los datos del mapa de bits posiblemente serán representados por un color cercano en el dispositivo de salida, siempre que los colores en el mapa de bits de la fuente y en el dispositivo de destino estén distribuidos uniformemente entre todos los colores posibles. La Figura 2-2 ilustra este caso.

Figura 2-2: Desplegando datos con pocos colores en un dispositivo con muchos colores
FIGURA 2-2: Desplegando datos con pocos colores en un dispositivo con muchos colores

Este proceso, llamado cuantización, resulta en una pérdida de datos. Para las imágenes de fuente que contienen muchos colores, la cuantización puede provocar cambios inaceptables a la apariencia, los cuales se dice que son el resultado de artefactos de cuantización. Ejemplos de artefactos de cuantización son bandas, patrones Moire, y la introducción de nuevos colores en la imagen de destino que no estaban presentes en los datos de fuente. Sin embargo, los artefactos de cuantización tienen sus usos; un tipo de proceso de cuantización, llamado convolución, puede usarse para remover ruido espurio de una imagen y para de hecho mejorar su apariencia. Pero, también puede cambiar el balance de color de una imagen de destino del definido en el archivo fuente.

En el siguiente caso, el dispositivo de salida puede desplegar menos colores de los definidos en los datos de la fuente. Un ejemplo común es desplegar datos de 8 bits por pixel (que corresponden a 256 colores) en un dispositivo capaz de desplegar datos de 4 bits (que corresponden a 16 colores). En este caso, puede haber colores definidis en el mapa de bits que no pueden representarse en el display de 4 bits. Así, la aplicación de renderización debe trabajar para hacer concordar los colores en la fuente y en el destino. En algún punto en el proceso de conversión de color, el número de colores definidos en los datos de la fuente deben reducirse para hacer encajar el número disponible en el dispositivo de destino. Este paso de reducción, o cuantización, se ilustra en la Figura 2.3.

Figura 2-3: Desplegando datos con muchos colores en un dispositivo con pocos colores
FIGURA 2-3: Desplegando datos con muchos colores en un dispositivo con pocos colores



Datos de Pixel y Paletas

Obviamente, los valores de pixeles almacenados en un archivo corresponden a colores. ¿Pero cómo se especifican de hecho los colores?

Los datos de pixeles de 1 bit, capaces de tener los valores 0 y 1, solo pueden representar completamente imágenes que contienen dos colores. Así, solo hay dos formas de hacer encajar los valores de pixeles en el archivo con los colores en una pantalla. En la mayoría de situaciones, encontrarás que ya existe una convención que establece qué valor corresponde a cuál color, aunque puede haber un mecanismo separado en el archivo para cambiar esto. Esta definición también puede cambiarse en tiempo real por la aplicación de renderización.

Los datos de pixeles que consisten de más de 1 bit por pixel usualmente representan un conjunto de valores de índice en una paleta de color, aunque en algunos casos hay una representación numérica directa del color en un esquema de definición de color.

Especificando Colores con Paletas

Una paleta, la cual a veces es llamada mapa de color, mapa de índice, tabla de colores, o tabla de look-up (LUT), es un arreglo de 1 dimensión de valores de color. Como sugiere el sinónimo tabla de look-up, esta es la piedra angular del método por el cual los colores pueden ser indirectamente referidos al especificar sus posiciones en un arreglo. Usando este método, los datos en un archivo pueden almacenarse como una serie de valores de índices, usualmente pequeños valores enteros, los cuales pueden reducir drásticamente el tamaño de los datos de pixeles cuando solo un pequeño número de colores necesita ser representado. Se dice que los mapas de bits que usan este método de representación usan un almacenamiento indirecto, o de pseudo-color.

Los datos de 4 bits, por ejemplo, pueden usarse para representar imágenes que consisten de 16 colores. Estos 16 colores usualmente se definen en una paleta que casi siempre está incluida en algún lugar en el archivo. Cada uno de los valores de pixeles que conforman los datos de pixeles es un índice dentro de esta paleta y consiste de uno de los valores 0 a 15. El trabajo de una aplicación de renderización es leer y examinar un valor de pixel desde el archivo, usarlo como un índice en la paleta, y recuperar el valor del color desde la paleta, el cual es usado entonces para especificar un pixel coloreado en un dispositivo de salida.

La Figura 2-4 ilustra cómo puede usarse una paleta para especificar un color.

Figura 2-4: Usando una paleta para especificar un color
FIGURA 2-4: Usando una paleta para especificar un color

La paleta es un arreglo de colores definido tan precisamente como sea posible. En la práctica, cada elemento de la paleta es usualmente de 24 bits, o de 3 bytes, aunque para acomodarse a futuras expansiones y dependencias de máquina, cada elemento a veces se almacena en 32 bits, o 4 bytes. Curiosamente, los modelos de color, muchos de los cuales existían antes de la era de la computación, eran a menudo construidos alrededor de la partición igual de los colores posibles en tres variables, encajando así claramente en tres bytes de almacenamiento de datos. (Incluimos una discusión de modelos de color en la sección llamada "Color" más tarde en este capítulo.)

Lo que esto significa es que las paletas son tres o cuatro veces tan grandes como el número máximo de colores definidos. Por ejemplo, una paleta de color de 4 bits es:

3 bytes por color * 16 colores = 48 bytes en longitud

o:

4 bytes por color * 16 colores = 64 bytes en longitud

dependiendo de si se usan tres o cuatro bytes para almacenar cada definición de color.

De manera similar, los datos de pixel de 8 bits pueden usarse para representar imágenes que consisten de 256 colores. Cada uno de los valores de pixeles, en el rango 0 a 255, es un índice en una paleta de 256 colores. En este caso, la paleta es:

3 bytes por color * 256 colores = 768 bytes en longitud

o:

4 bytes por color * 256 colores = 1024 bytes en longitud

Problemas Al Usar Paletas

Digamos que el valor (255,0,0) representa el color rojo en el modelo de color usado por nuestro formato de imagen. Haremos que nuestra paleta de ejemplo defina 16 colores, arreglados como un arreglo de 16 elementos:

(  0,  0,  0)
(255,255,255)
(255,  0,  0)
(  0,255,  0)
(  0,  0,255)
(255,255,  0)
(  0,255,255)
(255,  0,255)
(128,  0,  0)
(  0,128,  0)
(  0,  0,128)
(128,128,  0)
(  0,128,128)
(128,  0,128)
(128,128,128)
(255,128,128)

Ya que (255,0,0) resulta ser el tercer elemento en la paleta, podemos almacenar el valor 2 (si el arreglo está basado en 0, como en el lenguaje C), con la convención implícita de que los valores han de ser interpretados como valores de índice en el arreglo. Así, cada vez que una especificación para el color rojo ocurra en los datos del pixel, podemos almacenar 2 en su lugar, y podemos hacer lo mismo para otros colores encontrados en la imagen.

La información de color puede tomar una cantidad sustancial de espacio. En algunos casos, el uso de una paleta hace que el almacenamiento del color sea más eficiente; en otros casos, almacenar colores directamente, en lugar de a través de paletas, es más eficiente.

En los formatos de imagen más grandes y complejos, el almacenamiento indirecto a través de una paleta ahorra espacio al reducir la cantidad de datos almacenados en el archivo. Si estás, por ejemplo, usando un formato que almacena tres bytes de información de color por pixel (un método comúnmente usado) y puede usar hasta 256 colores, los valores de pixeles que conforman el mapa de bits de una imagen de 320x200 pixeles ocuparía 192,000 (320 * 200 * 3) bytes de almacenamiento. Si la misma imagen en lugar de eso usara una paleta con 256 elementos de 3 bytes, cada pixel en el mapa de bits solamente necesitaría ocupar 1 byte, justo lo suficiente para mantener un valor de índice de mapa de color en el rango 0-255. Esto elimina 2 de cada 3 bytes en cada pixel, reduciendo el espacio requerido a 64,000 bytes (320 * 200 * 1).

De hecho, tenemos que agregar la longitud de la paleta en sí, la cual es 768 bytes (256 * 3), así que los datos relevantes en el archivo serían 64,768 bytes, para un ahorro de casi un factor de tres sobre el método anterior de almacenamiento. (Nota, sin embargo, que si la cantidad de datos de mapa de bits en el archivo es muy pequeña, el espacio extra creado por la inclusión de la paleta puede negar cualquier ahorro ganado al cambiar el método de almacenamiento.

) El almacenamiento de color indirecto a través del uso de paletas tiene varias ventajas más allá de lo obvio. En primer lugar, si necesitas saber cuántos colores están almacenados en la imagen (por ejemplo, una imagen de 256 colores no siempre contiene 256 colores), leer la paleta es una tarea simple y también lo es determinar cuántos de sus elementos están siendo usados o son duplicados de otros. Los elementos sin usar en la mayoría de los formatos usualmente tienen un valor de 0.

Las paletas también son útiles cuando deseas cambiar los colores en una imagen. Si deseas cambiar todos los pixeles rojos en la imagen renderizada a verde, por ejemplo, todo lo que necesitas hacer es cambiar el valor apropiado que define el color rojo en la paleta, al valor apropiado para verde.

Como hemos mencionado, el uso de las paletas no es apropiado en cada caso. Una paleta en sí misma usa una cantidad sustancial de espacio. Por ejemplo, una paleta que define 32,768 colores ocuparía un mínimo de 98,304 bytes. Por esta razón, las imágenes que contienen más de 256 colores generalmente se almacenan en formato literal, absoluto o color verdadero (en lugar de en paletas), en donded cada valor de pixel corresponde directamente a un único color.

Las paletas fueron ideadas para tratar el problema del limitado número de colores disponibles en algunos dispositivos de salida. Sin embargo, si un dispositivo de salida no provee asistencia de hardware al software de aplicación, el uso de un formato basado en paleta agrega un nivel extra de complicación previo a la aparición de la imagen en el dispositivo de salida. Si este dispositivo puede soportar color verdadero, puede que sea mejor usar un formato que soporte color verdadero, aun cuando la imagen pueda tener unos pocos colores. Como regla general, las imágenes que contienen miles o millones de colores se almacenan mejor un formato que soporte color verdadero, ya que el número y el tamaño de los elementos necesarios en un formato basado en paleta puede provocar que el tamaño de la paleta requerido se acerque al tamaño de los datos de la imagen de mapa de bits en cuestión.

Antes de continuar la discusión sobre cómo se almacenan los colores en un archivo, tenemos que divagar brevemente para hablar sobre cómo se definen los colores. La discusión de las paletas continúa en la sección "...Y De Vuelta a las Paletas".

Unas Palabras Sobre los Espacios de Color

Los colores se definen al especificar varios valores, usualmente tres. Estos valores especifican la cantidad de cada uno de un conjunto de colores fundamentales, a veces llamados canales de color, los cuales se mezclan para producir colores compuestos. Un color compuesto es entonces especificado como un conjunto ordenado de valores. Si "conjunto ordenado de valores" te llama la atención (en la misma manera que "par ordenado"), puedes estar seguro de que también le pareció familiar a la gente que creó las definiciones de color. Se dice que un color particular representa un punto en un trazo gráfico de todos los colores posibles. Por esto, la gente a veces se refiere a un color como un punto en un espacio de color.

El RGB es una definición común de color. En el modelo o sistema de color RGB, los colores rojo, verde y azul se consideran fundamentales e indescomponibles. Un color puede especificarse al proveer un triplo RGB en la forma (R,G,B). La gente a veces piensa en los triplets de color en términos de porcentajes, aunque los porcentajes no son, de hecho, usados para expresar definiciones de color en cuestión. Tú podrías caracterizar los colores en el modelo de color RGB de la siguiente forma:

(0%, 0%, 0%) Negro
(100%, 100%, 100%) Blanco
(100%, 0%, 0%) Rojo
(50%, 50%, 50%) Gris claro

y así sucesivamente.

Hay muchos refinamientos de esto, y siempre puedes encontrar a alguien que argumente sobre qué números especifican qué color. Esta es la idea básica, sin embargo. Se dice que cada uno de estos triplos RGB define un punto en el espacio de color RGB.

Cuando almacenas datos de color en un archivo, es más práctico especificar el valor de cada componente de color, no como un porcentaje, sino como un valor en un rango predefinido. Si el espacio permitido para cada componente de color es 1 byte (8 bits), el rango natural es 0 a 255. Ya que los colores se definen comúnmente usando 24 bits, o 3 bytes, lo natural es asignar cada uno de estos 3 bytes para usarse como el valor del componente de color en el modelo de color. En el color RGB, por ejemplo, usando 3 bytes para cada color, los colores usualmente se almacenan como triplos RGB en el rango 0 a 255, con 0 representando una intensidad de cero y 255 representando la intensidad máxima.

RGB = ([0-255], [0-255], [0-255])

Así, los valores de pixeles en el ejemplo anterior serían:

(0,0,0) Negro
(255,255,255) Blanco
(255,0,0) Rojo
(127,127,127) Gris claro

Este ejemplo asume, por supuesto, que 0 indica la menor cantidad, y 255 la mayor cantidad de un componente de color particular. Ocasionalmente, encontrarás que un creador de formato o arquitecto de aplicación perversamente ha elegido invertir el sentido "natural" de la definición de color, y ha hecho que RGB(0, 0, 0) sea blanco y RGB(255, 255, 255) sea negro, pero afortunadamente, esto es raro.

La sección más adelante en este capítulo llamada "Cómo se Representa el Color", describe el RGB y otros sistemas de color.

Un Poco Más Sobre el Color Verdadero

La palabra color verdadero aparece en las discusiones sobre imágenes que contienen un gran número de colores. ¿Qué queremos decir con grandes en este contexto? La mayoría de gente considera 200 a 300K como significativamente grande. Recuarda de la discusión anterior que una paleta que contiene 256 definiciones de color usa un máximo de 64 bytes de espacio, y que una paleta con 32,768 o más colores usa casi 100K, como mínimo. A la luz de esto, 256 no es un número "grande" de colores. La mayoría de gente considera 32,768, 65,536 y 16.7 millones de colores como "grandes", no obstante. Y este es solo el espacio que una paleta ocupa; ¡ni siquiera estamos hablando de los datos de imagen!

En lugar de incluir en un archivo una paleta enorme en el que los valores de pixeles son índices dentro de la paleta, los valores de valores pueden tratarse como valores literales de color. En la práctica, los valores de pixel se componen de 3 partes, y cada parte representa un componente de color en el modelo de color en uso (por ejemplo, RGB). Los valores de pixel de imágenes que contienen 32,768 o 65,536 colores, típicamente se almacenan en dos bytes sucesivos, o 16 bits, en un archivo, porque casi todas las máquinas manejan datos de 1 byte a la vez como mínimo. Una aplicación de renderización debe leer estos valores de 16 bits y descomponerlos en valores de 5 bits por componente de color.

16 bits = 2 bytes = (8 bits, 8 bits) => (1, 5, 5, 5) = (1, R, G, B)

Cada componente de 5 bits puede tener valores en el rango de 0 a 32. En el caso de imágenes RGB de 32,768 colores, solo 15 bits son significativos, y 1 bit se desperdicia o es usado para algún otro propósito. Las imágenes RGB de 65,536 colores descomponen el valor de pixel de 16 bits asimétricamente, como se muestra a continuación, a fin de sacar provecho del bit extra:

16 bits = 2 bytes = (8 bits, 8 bits) => (6, 5, 5) = (R, G, B)

De hecho, una subdivisión más común es:

16 bits = 2 bytes = (8 bits, 8 bits) => (5, 6, 5) = (R, G, B)

Aquí, el bit extrá es dado al componente verde, porque el ojo humano es más sensible al verde de lo que es para el rojo y el azul. El orden de los componentes de color es arbitrario, y el orden e interpretación de los componentes dentro de un valor de pixel varía de un formato a otro. Así, los componentes de un valor de pixel de 16 bits pueden interpretarse como (G,B,R) tanto como (R,G,B) y (B,R,G). Especificar los colores en la secuencia (R,G,B) tiene atractivo, porque los colores están arreglados por frecuencia electromagnética, estableciendo su orden en el espectro físico.

Los valores de pixel de 24 bits se almacenan ya sea en 3 bytes:

24 bits = 3 bytes = (8 bits, 8 bits, 8 bits) = (R,G,B)

o 4 bytes:

24 bits = 4 bytes = (8 bits, 8 bits, 8 bits, 8 bits) = (R,G,B, sin usar)

Una división igual entre los componentes de color de este modelo, un byte para cada componente, es el esquema más común, aunque otras divisiones no son desconocidas.

...Y De Vuelta a las Paletas

Anteriormente en este capítulo, introducimos el uso de las paletas. Aquí, continuamos con la discusión de los diferentes tipos de paletas e ilustramos con algunos ejemplos concretos.

Tipos de Paletas

Hay varios tipos diferentes de hablar sobre las paletas.

Una paleta de canal individual contiene solamente un valor de color por elemento, y este valor de color mapea directamente a un color único de pixel. Cada elemento de una paleta de canal individual puede tener la siguiente forma, por ejemplo:

(G) = (223)

Una paleta de múltiples canales (o paleta multicanal) contiene dos o más valores individuales de color por elemento de color. Cada elemento de una paleta de 3 canales que usa rojo, verde y azul puede tener la siguiente forma, por ejemplo:

(R,G,B) = (255,128,78)

Aquí, R especifica el valor de un canal, G especifica el valor del segundo canal, y B especifica el valor del tercer canal. Si una imagen contiene cuatro componentes de color, como con el sistema CMYK descrito más adelante en este capítulo, entonces se puede usar un mapa de color de 4 canales, y así sucesivamente.

Las paletas orientadas a pixeles almacenan todos los datos de color de los pixeles como bits continuos dentro de cada elemento del arreglo. Como notamos anteriormente, en una paleta RGB, cada elemento en la paleta consiste de un triplo de valores. Esto corresponde a la manera en la que los valores de pixeles se almacenan en el archivo, que está usualmente en orden RGB o BGR:

(RGBRGBRGBRGBRGB...) o (BGRBGRBGRBGRBGR...)

Así, la paleta se ve así:

(RGB)(RGB)(RGB) o (BGR)(BGR)(BGR)

En una paleta orientada a planos, los componentes de color de pixel están segregadoslos valores correspondientes a un canal de color se almacenan juntos, y la paleta se ve como si estuviera hecha de tres paletas de canal individual, una para cada canal de color. Esto corresponde a la manera en la que los valores de pixeles están arreglados en el archivo (es decir, como múltiples planos de color):

(RRRRR...GGGGG...BBBBB) o (BBBBB...GGGGG...RRRRR)

Así, una paleta pequeña puede verse así:

(R)(R)(R)(G)(G)(G)(B)(B)(B)

o:

(B)(B)(B)(G)(G)(G)(R)(R)(R)

Aunque esto puede verse como una paleta individual que contiene tres planos de color, usualmente es mejor visualizarlo como tres paletas separadas, cada una conteniendo un único plano de color. De esta manera no tendrás problema en llamar al primer elemento de cada plano de color el elemento cero.

De la discusión anterior, debería ser claro que tanto las paletas de canal individual como las de múltiples canales pueden estar orientadas a pixeles o a planos. Por ejemplo:

La Figura 2-5 ilustra estos tipos diferentes de paletas.

Figura 2-5: Tipos de paletas
FIGURA 2-5: Tipos de paletas

Como se notó anteriormente, el número de elementos en una paleta es usualmente una potencia de dos y típicamente corresponde al número máximo de colores contenidos en la imagen, que a su vez se refleja en el tamaño de los valores de pixel en el archivo. Por ejemplo, un valor de pixel de 8 bits puede representar 256 colores diferentes y se acompaña por una paleta de 256 elementos. Si una imagen tiene menos colores que el máximo tamaño de la paleta, cualesquiera elementos usados en la paleta idealmente estarán a cero. Varios formatos, más notablemente CGM y TGA, tienen la habilidad de variar el número de elementos en la paleta según se necesita. Si una imagen TGA contiene solo 57 colores, por ejemplo, puede tener una paleta con solo 57 elementos.

También es interesante notar que los elementos usables en una paleta no siempre están arreglados de forma contigua, y no siempre comienzan con el valor del elemento cero establecido. Una imagen de 2 colores con una paleta de 256 colores (sí, ha sido hecho) puede tener sus colores indexados en las ubicaciones 0 y 1, 0 y 255, 254 a 255, o incluso 47 y 156. Las ubicaciones son determinados por el software que escribe el archivo de imagen y por lo tanto en última instancia por el programador que creó la aplicación de software. (Elegimos no comentar más.)

Ejemplos de Paletas

Veamos unos pocos ejemplos de paletas. La más simple es la paleta de 2 colores, o monocromática:

/* Un BYTE es un carácter de 8 bits */
typedef struct _MonoPalette
{
	BYTE Color[2];
} MONO_PALETTE;
MONO_PALETTE Mono = { {0x00, 0x01} };

En este ejemplo, vemos un arreglo de 2 elementos que contiene los valores de color 0x00 y 0x01 en el elemento 0 y 1 respectivamente. En el archivo, todos los valores de pixeles son índices. Un pixel con un valor de 0 sirve como un índice al color representado por el valor 0x00. De la misma manera, un pixel con un valor de 1 sirve como un índice al color representado por el valor 0x01. Ya que este mapa de bits contiene solo dos colores, y cada color de pixel puede representarse por un único bit, puede parecer más fácil almacenar estos valores directamente en el mapa de bits como valores de bits en lugar de usar una paleta. Es más fácil, por supuesto, pero algunos formatos de solo paleta requieren que este tipo de paleta esté presente incluso para mapas de bits monocromáticos.

Este es un ejemplo más práctico, una paleta de 16 elementos usada para mapear una paleta de escala de grises:

/* Un BYTE es un carácter de 8 bits */
typedef struct _GrayPalette
{
	BYTE Color[16];
} GRAY_PALETTE;
GRAY_PALETTE Gray =
{
	{0x00,
	0x14,
	0x20,
	0x2c,
	0x38,
	0x45,
	0x51,
	0x61,
	0x71,
	0x82,
	0x92,
	0x92,
	0xa2,
	0xb6,
	0xcb,
	0xe3,
	0xff}
};

Nota que en estos dos ejemplos, que cada elemento de color está representado por un único valor, así que esta es una paleta de un único canal. Podríamos de manera igualmente fácil usar una paleta de 3 canales, que representen cada elemento de color gris por su valor RGB.

typedef struct _RGB
{
	BYTE    Red;    /* Valor del canal rojo */
	BYTE    Green;  /* Valor del canal verde */
	BYTE    Blue;   /* Valor del canal azul */
} RGB;
RGB Gray[16] =
{
	{0x00, 0x00, 0x00},
	{0x14, 0x14, 0x14},
	{0x20, 0x20, 0x20},
	{0x2c, 0x2c, 0x2c},
	{0x38, 0x38, 0x38},
	{0x45, 0x45, 0x45},
	{0x51, 0x51, 0x51},
	{0x61, 0x61, 0x61},
	{0x71, 0x71, 0x71},
	{0x82, 0x82, 0x82},
	{0x92, 0x92, 0x92},
	{0xa2, 0xa2, 0xa2},
	{0xb6, 0xb6, 0xb6},
	{0xcb, 0xcb, 0xcb},
	{0xe3, 0xe3, 0xe3},
	{0xff, 0xff, 0xff}
};

Este último ejemplo es un ejemplo de paleta multicanal orientada a pixeles. Podemos alterarla para almacenar la información de color con un estilo orientado a planos de la siguiente forma:

TYPEDEF struct _PlanePalette
{
	BYTE    Red[16];    /* Valores del plano rojo */
	BYTE    Green[16];  /* Valores del plano verde */
	BYTE    Blue[16];   /* Valores del plano azul */
} PLANE_PALETTE;
PLANE_PALETTE Planes =
{
	{0x00, 0x14, 0x20, 0x2c, 0x38, 0x45, 0x51, 0x61, /* Plano rojo */
	0x71, 0x82, 0x92, 0xa2, 0xb6, 0xcb, 0xe3, 0xff},
	{0x00, 0x14, 0x20, 0x2c, 0x38, 0x45, 0x51, 0x61, /* Plano verde */
	0x71, 0x82, 0x92, 0xa2, 0xb6, 0xcb, 0xe3, 0xff},
	{0x00, 0x14, 0x20, 0x2c, 0x38, 0x45, 0x51, 0x61, /* Plano azul */
	0x71, 0x82, 0x92, 0xa2, 0xb6, 0xcb, 0xe3, 0xff}
};

Finalmente, miremos un ejemplo del mundo real, la paleta de la VGA de IBM en amplio uso. Esta paleta de 256 colores contiene una subpaleta de 16 colores (la "paleta EGA"), una paleta de escala de grises de 16 elementos, y una paleta de 24 colores, cada uno con nueve diferentes variaciones de saturación e intensidad. Nota que los últimos ocho elementos de la paleta no se usan y por lo tanto están a cero:

struct _VgaPalette
{
	BYTE    Red;
	BYTE    Green;
	BYTE    Blue;
} VGA_PALETTE;
VGA_PALETTE VgaColors[256] =
{
/* Tabla de Color EGA */
{0x00, 0x00, 0x00}, {0x00, 0x00, 0xaa},
{0x00, 0xaa, 0x00}, {0x00, 0xaa, 0xaa},
{0xaa, 0x00, 0x00}, {0xaa, 0x00, 0xaa},
{0xaa, 0x55, 0x00}, {0xaa, 0xaa, 0xaa},
{0x55, 0x55, 0x55}, {0x55, 0x55, 0xff},
{0x55, 0xff, 0x55}, {0x55, 0xff, 0xff},
{0xff, 0x55, 0x55}, {0xff, 0x55, 0xff},
{0xff, 0xff, 0x55}, {0xff, 0xff, 0xff},
/* Tabla de Escala de Grises */
{0x00, 0x00, 0x00}, {0x14, 0x14, 0x14},
{0x20, 0x20, 0x20}, {0x2c, 0x2c, 0x2c},
{0x38, 0x38, 0x38}, {0x45, 0x45, 0x45},
{0x51, 0x51, 0x51}, {0x61, 0x61, 0x61},
{0x71, 0x71, 0x71}, {0x82, 0x82, 0x82},
{0x92, 0x92, 0x92}, {0xa2, 0xa2, 0xa2},
{0xb6, 0xb6, 0xb6}, {0xcb, 0xcb, 0xcb},
{0xe3, 0xe3, 0xe3}, {0xff, 0xff, 0xff},
/* Tabla de 24 Colores */
{0x00, 0x00, 0xff}, {0x41, 0x00, 0xff},
{0x7d, 0x00, 0xff}, {0xbe, 0x00, 0xff},
{0xff, 0x00, 0xff}, {0xff, 0x00, 0xbe},
{0xff, 0x00, 0x7d}, {0xff, 0x00, 0x41},
{0xff, 0x00, 0x00}, {0xff, 0x41, 0x00},
{0xff, 0x7d, 0x00}, {0xff, 0xbe, 0x00},
{0xff, 0xff, 0x00}, {0xbe, 0xff, 0x00},
{0x7d, 0xff, 0x00}, {0x41, 0xff, 0x00},
{0x00, 0xff, 0x00}, {0x00, 0xff, 0x41},
{0x00, 0xff, 0x7d}, {0x00, 0xff, 0xbe},
{0x00, 0xff, 0xff}, {0x00, 0xbe, 0xff},
{0x00, 0x7d, 0xff}, {0x00, 0x41, 0xff},
{0x7d, 0x7d, 0xff}, {0x9e, 0x7d, 0xff},
{0xbe, 0x7d, 0xff}, {0xdf, 0x7d, 0xff},
{0xff, 0x7d, 0xff}, {0xff, 0x7d, 0xdf},
{0xff, 0x7d, 0xbe}, {0xff, 0x7d, 0x9e},
{0xff, 0x7d, 0x7d}, {0xff, 0x9e, 0x7d},
{0xff, 0xbe, 0x7d}, {0xff, 0xdf, 0x7d},
{0xff, 0xff, 0x7d}, {0xdf, 0xff, 0x7d},
{0xbe, 0xff, 0x7d}, {0x9e, 0xff, 0x7d},
{0x7d, 0xff, 0x7d}, {0x7d, 0xff, 0x9e},
{0x7d, 0xff, 0xbe}, {0x7d, 0xff, 0xdf},
{0x7d, 0xff, 0xff}, {0x7d, 0xdf, 0xff},
{0x7d, 0xbe, 0xff}, {0x7d, 0x9e, 0xff},
{0xb6, 0xb6, 0xff}, {0xc7, 0xb6, 0xff},
{0xdb, 0xb6, 0xff}, {0xeb, 0xb6, 0xff},
{0xff, 0xb6, 0xff}, {0xff, 0xb6, 0xeb},
{0xff, 0xb6, 0xdb}, {0xff, 0xb6, 0xc7},
{0xff, 0xb6, 0xb6}, {0xff, 0xc7, 0xb6},
{0xff, 0xdb, 0xb6}, {0xff, 0xeb, 0xb6},
{0xff, 0xff, 0xb6}, {0xeb, 0xff, 0xb6},
{0xdb, 0xff, 0xb6}, {0xc7, 0xff, 0xb6},
{0xb6, 0xdf, 0xb6}, {0xb6, 0xff, 0xc7},
{0xb6, 0xff, 0xdb}, {0xb6, 0xff, 0xeb},
{0xb6, 0xff, 0xff}, {0xb6, 0xeb, 0xff},
{0xb6, 0xdb, 0xff}, {0xb6, 0xc7, 0xff},
{0x00, 0x00, 0x71}, {0x1c, 0x00, 0x71},
{0x38, 0x00, 0x71}, {0x55, 0x00, 0x71},
{0x71, 0x00, 0x71}, {0x71, 0x00, 0x55},
{0x71, 0x00, 0x38}, {0x71, 0x00, 0x1c},
{0x71, 0x00, 0x00}, {0x71, 0x1c, 0x00},
{0x71, 0x38, 0x00}, {0x71, 0x55, 0x00},
{0x71, 0x71, 0x00}, {0x55, 0x71, 0x00},
{0x38, 0x71, 0x00}, {0x1c, 0x71, 0x00},
{0x00, 0x71, 0x00}, {0x00, 0x71, 0x1c},
{0x00, 0x71, 0x38}, {0x00, 0x71, 0x55},
{0x00, 0x71, 0x71}, {0x00, 0x55, 0x71},
{0x00, 0x38, 0x71}, {0x00, 0x1c, 0x71},
{0x38, 0x38, 0x71}, {0x45, 0x38, 0x71},
{0x55, 0x38, 0x71}, {0x61, 0x38, 0x71},
{0x71, 0x38, 0x71}, {0x71, 0x38, 0x61},
{0x71, 0x38, 0x55}, {0x71, 0x38, 0x45},
{0x71, 0x38, 0x38}, {0x71, 0x45, 0x38},
{0x71, 0x55, 0x38}, {0x71, 0x61, 0x38},
{0x71, 0x71, 0x38}, {0x61, 0x71, 0x38},
{0x55, 0x71, 0x38}, {0x45, 0x71, 0x38},
{0x38, 0x71, 0x38}, {0x38, 0x71, 0x45},
{0x38, 0x71, 0x55}, {0x38, 0x71, 0x61},
{0x38, 0x71, 0x71}, {0x38, 0x61, 0x71},
{0x38, 0x55, 0x71}, {0x38, 0x45, 0x71},
{0x51, 0x51, 0x71}, {0x59, 0x51, 0x71},
{0x61, 0x51, 0x71}, {0x69, 0x51, 0x71},
{0x71, 0x51, 0x71}, {0x71, 0x51, 0x69},
{0x71, 0x51, 0x61}, {0x71, 0x51, 0x59},
{0x71, 0x51, 0x51}, {0x71, 0x59, 0x51},
{0x71, 0x61, 0x51}, {0x71, 0x69, 0x51},
{0x71, 0x71, 0x51}, {0x69, 0x71, 0x51},
{0x61, 0x71, 0x51}, {0x59, 0x71, 0x51},
{0x51, 0x71, 0x51}, {0x51, 0x71, 0x59},
{0x51, 0x71, 0x61}, {0x51, 0x71, 0x69},
{0x51, 0x71, 0x71}, {0x51, 0x69, 0x71},
{0x51, 0x61, 0x71}, {0x51, 0x59, 0x71},
{0x00, 0x00, 0x41}, {0x10, 0x00, 0x41},
{0x20, 0x00, 0x41}, {0x30, 0x00, 0x41},
{0x41, 0x00, 0x41}, {0x41, 0x00, 0x30},
{0x41, 0x00, 0x20}, {0x41, 0x00, 0x10},
{0x41, 0x00, 0x00}, {0x41, 0x10, 0x00},
{0x41, 0x20, 0x00}, {0x41, 0x30, 0x00},
{0x41, 0x41, 0x00}, {0x30, 0x41, 0x00},
{0x20, 0x41, 0x00}, {0x10, 0x41, 0x00},
{0x00, 0x41, 0x00}, {0x00, 0x41, 0x10},
{0x00, 0x41, 0x20}, {0x00, 0x41, 0x30},
{0x00, 0x41, 0x41}, {0x00, 0x30, 0x41},
{0x00, 0x20, 0x41}, {0x00, 0x10, 0x41},
{0x20, 0x20, 0x41}, {0x28, 0x20, 0x41},
{0x30, 0x20, 0x41}, {0x38, 0x20, 0x41},
{0x41, 0x20, 0x41}, {0x41, 0x20, 0x38},
{0x41, 0x20, 0x30}, {0x41, 0x20, 0x28},
{0x41, 0x20, 0x20}, {0x41, 0x28, 0x20},
{0x41, 0x30, 0x20}, {0x41, 0x38, 0x20},
{0x41, 0x41, 0x20}, {0x38, 0x41, 0x20},
{0x30, 0x41, 0x20}, {0x28, 0x41, 0x20},
{0x20, 0x41, 0x20}, {0x20, 0x41, 0x28},
{0x20, 0x41, 0x30}, {0x20, 0x41, 0x38},
{0x20, 0x41, 0x41}, {0x20, 0x38, 0x41},
{0x20, 0x30, 0x41}, {0x20, 0x28, 0x41},
{0x2c, 0x2c, 0x41}, {0x30, 0x2c, 0x41},
{0x34, 0x2c, 0x41}, {0x3c, 0x2c, 0x41},
{0x41, 0x2c, 0x41}, {0x41, 0x2c, 0x3c},
{0x41, 0x2c, 0x34}, {0x41, 0x2c, 0x30},
{0x41, 0x2c, 0x2c}, {0x41, 0x30, 0x2c},
{0x41, 0x34, 0x2c}, {0x41, 0x3c, 0x2c},
{0x41, 0x41, 0x2c}, {0x3c, 0x41, 0x2c},
{0x34, 0x41, 0x2c}, {0x30, 0x41, 0x2c},
{0x2c, 0x41, 0x2c}, {0x2c, 0x41, 0x30},
{0x2c, 0x41, 0x34}, {0x2c, 0x41, 0x3c},
{0x2c, 0x41, 0x41}, {0x2c, 0x3c, 0x41},
{0x2c, 0x34, 0x41}, {0x2c, 0x30, 0x41},
{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00},
{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00},
{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00},
{0x00, 0x00, 0x00}, {0x00, 0x00, 0x00}
};



Color

Entender cómo se definen los colores en los datos gráficos es importante para entender los formatos de archivo gráficos. En esta sección, tocamos algunos de los muchos factores que gobiernan el cómo se perciben los colores. Esta no es de ninguna manera una discusión exhaustiva. Solo queremos asegurarnos de que tengas una apreciación de algunos de los problemas que surgen cuando la gente comienza a tratar con el color.

Cómo Vemos el Color

El ojo tiene un número finito de receptores de color que, tomados en conjunto, responden al rango completo de las frecuencias de luz (aproximadamente 380 a 770 nanómetros). Como resultado, el ojo teóricamente soporta solo la percepción de unos 10,000 colores simultáneamente (aunque, como hemos mencionado, pueden percibirse muchos más colores que estos, aunque no resueltos simultáneamente).

El ojo también está parcializado al tipo de luz que detecta. Es más sensible a la luz verde, seguida por la roja, y luego la azul. También es el caso que el sistema de percepción visual puede detectar los contrastes entre colores adyacentes más fácilmente de lo que puede detectar diferencias absolutas de color, particularmente si esos colores están físicamente separados en el objeto que se está viendo. Además, la habilidad de discernir colores varía de una persona a otra; se ha estimado que una de doce personas tiene alguna forma de ceguera del color.

Además, el ojo está limitado en su habilidad de resolver el color de objetos minúsculos. El tamaño de un pixel en una pantalla CRT típica, por ejemplo, es de menos de un tercio de milímetro en diámetro. Cuando un número grande de pixeles se empacan juntos, cada uno de diferente color, el ojo es incapaz de resolver dónde termina un pixel y dónde comienza el siguiente, desde una distancia visual normal. El cerebro, sin embargo, debe hacer algo para cubrir el vacío entre dos pixeles adyacentes de distinto color e integrará, ignorará la borrosidad, o de otra manera se adaptará a la situación. Por estas y otras razones, el ojo típicamente percibe muchos menos colores de los que se despliegan físicamente en el dispositivo de salida.

Cómo se crea un color también juega un papel importante en cómo se percibe. Normalmente, pensamos en los colores como estando asociados a una única longitud de onda de luz. Sabemos, sin embargo, que dos o más colores pueden mezclarse para producir un nuevo color. Un ejemplo de esto es mezclar luz verde y roja para producir amarillo, o mezclar pigmentos amarillos y azules para producir un pigmento verde. La mezcla de colores también puede ocurrir cuando un objeto se ilumina por luz. El color del objeto siempre se mezclará con el color de la luz para producir un tercer color. Un objeto azul iluminado por luz blanca parece azul, mientras que el mismo objeto iluminado con luz roja parecerá violeta.

Una implicación de esto es que la misma imagen renderizada a dos dispositivos diferentes se verá diferente. Dos monitores a color diferentes, por ejemplo, raramente producen imágenes que se perciben igual, incluso si estos son de la misma marca y modelo. Otra implicación es que las imágenes renderizadas a diferentes tipos de dispositivos se verán diferentes. Un ejemplo es la diferencia entre una imagen renderizada a un monitor y una renderizada a un dispositivo de impresión a color en papel. Aunque hay numerosos esquemas diseñados para minimizar los problemas de concordancia de color, ninguno es totalmente satisfactorio.

Por estas y otras razones, la rendición exacta del color está llena de dificultades, y se sigue haciendo mucho trabajo. Aunque ha aparecido un número de dispositivos mecánicos recientemente en el mercado, en su mayoría están diseñados para trabajar con un tipo de dispositivo de salida. El árbitro definitivo de la calidad será la persona que mira la imagen en el dispositivo de salida.

Cómo se Representan Los Colores

Existen varios diferentes sistemas matemáticos que se usan para describir colores. Esta sección describe brevemente los sistemas de color más comúnmente usados en los formatos de archivo gráficos descritos en este libro.

NOTA

Ten en mente que la percepción del color es afectada por la fisiología, experiencia y las condiciones de visión. Por estas razones, todavía no se ha definido ningún sistema de representación del color, o en verdad será probable que lo sea, lo cual es satisfactorio bajo todas las circunstancias.

Para los propósitos de la discusión aquí, los colores siempre se representan por valores numéricos. El sistema de color más apropiado a usar depende del tipo de datos contenidos en el archivo. Por ejemplo, los datos de escala de grises de 1 bit y los datos a color pueden almacenarse de mejor manera usando un modelo de color diferente.

Los sistemas de color usados en los archivos gráficos típicamente son de la variedad tricromáticos colorimétricos, conocidos también como sistemas primarios de 3 colores. Los colores compuestos son creados al mezclar cantidades variablesde los tres colores primarios, lo cual resulta en la creación de un nuevo color. Los colores primarios son aquellos que no pueden crearse al mezclar otros colores. La totalidad de los colores que pueden crearse al mezclar los colores primarios conforma el espacio de color o gamut de color.

Sistemas de color aditivos y sustractivos

Los sistemas de color pueden separarse en dos categorías: sistemas de color aditivo y sistemas de color sustractivo. Los colores en los sistemas aditivos se crean al agregar colores al negro para crear nuevos colores. Entre más color se agregue, más tienden los colores resultantes al blanco.

La presencia de todos los colores primarios en cantidades suficientes crean blanco puro, mientras que la ausencia de todos los colores primarios crean negro puro. Los entornos de color aditivo son auto-luminosos. El color en los monitores, por ejemplo, es aditivo.

La sustracción de color funciona de la manera opuesta. Conceptualmente, los colores primarios son restados del blanco para crear nuevos colores. Entre más color se reste, más tiende el color resultante hacia negro. Así, la presencia de todos los colores primarios teóricamente crea negro puro, mientras que la ausencia de todos los colores primarios teóricamente crea blanco puro. Otra forma de ver este proceso es que el negro es la absorción total de toda la luz por los pigmentos de color. Los entornos sustractivos son reflectivos por naturaleza, y el color se transmite a nosotros al reflejar la luz desde una fuente externa. Cualquier imagen de color reproducida en papel es un ejemplo del uso de un sistema de color sustractivo.

Ningún sistema de color es perfecto. Como ejemplo, en un sistema de color sustractivo, la presencia de todos los colores crea negro, pero en la vida real la impresión de las tintas no es perfecta. Mezclar todos los colores usualmente produce un café lodoso en lugar de negro. Los negros que vemos en papel son solo aproximaciones del ideal matemático, e igualmente los otros colores.

Las siguientes pocas secciones describen algunos de los sistemas de color. La Tabla 2-1 muestra los valores correspondientes para los colores primarios y acromáticos usando los sistemas de color RGB, CMY y HSV.

RGB (Rojo-Verde-Azul)

RGB es quizás el sistema de color más ampliamente usado en los formatos de imagen hoy en día. Este es un sistema aditivo en el que cantidades variables de los colores rojo, verde y azul se agregan al negro para producir nuevos colores. Los archivos gráficos que usan el sistema de color RGB representan cada pixel como un triplo de color — tres valores numéricos en la forma (R,G,B), cada uno representando la cantidad de rojo, verde y azul en el pixel, respectivamente. Para los colores de 24 bits, el triplo (0,0,0) normalmente representa negro, y el triplo (255,255,255) representa blanco. Cuando los tres valores RGB están con el mismo valor —por ejemplo, (63,63,63) o (127,127,127), o (191,191,191)— el color resultante es un tono de gris.

TABLA 2-1: Valores equivalentes RGB, CMY y HSV

RGB CMY HSV
___________________________________________________________________________
Rojo 255,0,0 0,255,255 0,240,120
Amarillo 255,255,0 0,0,255 40,240,120
Verde 0,255,0 255,0,255 80,240,102
Cian 0,255,255 255,0,0 120,240,120
Azul 0,0,255 255,255,0 160,240,120
Magenta 255,0,255 0,255,0 200,240,120
Negro 0,0,0 255,255,255 160,0,0
Tonos de Gris 63,63,63
127,127,127
191,191,191
191,191,191
127,127,127
63,63,63
160,0,59
160,0,120
160,0,180
Blanco 255,255,255 0,0,0 160,0,240
___________________________________________________________________________

CMY (Cian-Magenta-Amarillo)

CMY es un sistema de color sustractivo usado por impresoras y fotógrafos para renderizar colores con tinta o emulsión, normalmente sobre una superficie blanca. Es usado por la mayoría de dispositivos de impresión que depositan pigmentos de color en papel blanco, tales como impresoras láser y de inyección de tinta. Cuando se iluminan, cada uno de los tres colores absorbe su color de luz complementario. El cian absorbe el rojo; el magenta absorbe el verde; y el amarillo absorbe el azul. Al aumentar la cantidad de tinta amarilla, por ejemplo, la cantidad de azul en la imagen disminuye.

Como en todos los sistemas sustractivos, decimos que en el sistema CMY, los colores se restan de la luz blanca por los pigmentos para crear nuevos colores. Los nuevos colores son las longitudes de onda de luz reflejada, en lugar de la absorbida, por los pigmentos CMY. Por ejemplo, cuando cian y magenta son absorbidos, el color resultante es amarillo. Se dice que el pigmento amarillo "resta" los componentes cian y magenta de la luz reflejada. Cuando todos los componentes CMY se restan, o son absorbidos, el color resultante es negro. Casi. Ya sea que es o no posible el obtener un negro perfecto es debatible. Ciertamente, un buen color negro no es obtenible sin tintas caras.

A la luz de esto, el sistema CMY ha dado lugar a una variante práctica, CMYK, con la K representando al color negro. Para compensar el uso de tintas caras y fuera de especificación, el color negro se agrega al sistema y se trata algo así como una variable independiente de color primario. Por esta razón, el uso del esquema CMYK a menudo es llamado una impresión de 4 colores, o color de proceso. En muchos sistemas, un punto de un color compuesto usualmente es una agrupación de cuatro puntos, cada uno de los colores CMYK. Esto puede fácilmente verse con una lupa examinando una fotografía de color reproducida en una revista lustrosa.

En muchos sistemas de composición de color del mundo real, los cuatro componentes de color CMYK se especifican como porcentajes en el rango 0% a 100%.

HSV (Hue, Saturation and Value — Matiz, Saturación y Valor)

El HSV es uno de muchos sistemas de color que varían el grado de propiedades de los colores para crear nuevos colores, en lugar de usar una mezcla de los colores en cuestión. El matiz especifica el "color" en el sentido común del término, tal como rojo, naranja, azul y así sucesivamente. La saturación (también llamada chroma), se refiera a la cantidad de blanco en un matiz; un matiz totalmente saturado (100 por ciento) no contiene blanco y aparece puro. Por extensión, un matiz parcialmente saturado aparece más claro en color debido a la mezcla de blanco. El matiz rojo con saturación de 50% aparece rosado, por ejemplo. El valor (también llamado brillo) es el grado de auto-luminicencia de un color — es decir, cuánta luz emite. Un matiz con una intensidad alta es muy brillante, mientras que un matiz con baja intensidad es oscuro.

El HSV (también llamado HSB por Matiz, Saturación y Brillo), se asemeja más al sistema de color usado por impresores y otros artistas, quienes crean colores agregando blanco, negro y gris a pigmentos puros para crear tintes, sombras y tonos. Un tinte es un color puro, completamente saturado, combinado con blanco, y una sombra es un color completamente saturado combinado con negro. Un tono es un color completamente saturado tanto con negro como con blanco (gris) agregado a este. Si relacionamos el HSV a este modelo de mezcla de colores, la saturación es la cantidad de blanco, el valor es la cantidad de negro, y el matiz es el color al que es agregado al blanco y al negro.

El modelo de color HLS (Hue, Lighness and Saturation) está relacionado de cerca al HSV y se comporta de la misma manera.

YUV (Señal Y, Señal U y Señal V)

El modelo YUV es un poco diferente a los otros modelos colorimétricos. Básicamente es una transformación linear de los datos de imagen RGB y es más ampliamente usado para codificar el color a usarse en la transmisión de televisión. (Nota, sin embargo, que esta transformación casi siempre va acompañada por una operación de cuantización separada, la cual introduce no-linearidades en la conversión). Y especifica la escala de gris o luminancia. Los componentes U y V corresponden a la crominancia (información de color). Otros modelos de color basados en YUV incluyen YCbCr y YPbPr.

Negro, Blanco y Gris

El negro, blanco y el gris se consideran colores neutrales (acromáticos) que no tienen matiz o saturación. El negro y el blanco establecen los extremos del rango, teniendo el blanco la intensidad mínima, el gris la intensidad intermedia, y el blanco la máxima intensidad. Uno puede decir que el gamut de gris es solo una rebanada de un espacio de color, cada uno de cuyos puntos contiene una cantidad igual de los tres colores primarios, no tiene saturación, y solo varía en intensidad.

El blanco, por conveniencia, a menudo es tratado en especificaciones de formato de archivo como un color primario. El gris usualmente se trata igual que otros colores compuestos. Un valor de pixel de 8 bits puede representar 256 colores compuestos diferentes o 256 tonos de gris diferentes. En el color RGB de 24 bits, (12,12,12), (128,128,128) y (199,199,199) son todos tonos de gris.

Overlays y Transparencia

Ciertos formatos de archivo están diseñados para soportar el almacenamiento de imágenes estáticas capturadas a partir de fuentes de video. En la práctica, las imágenes de este tipo se superponen en las fuentes de video en vivo en tiempo de renderización. Esta es una característica familiar de la transmisión convencional de televisión, en donde imágenes estáticas se muestran rutinariamente próximas a los animadores en vivo o en las noticias de la tarde.

Las imágenes normales son opacas, en el sentido de que no se hacen proviciones para permitir la manipulación y el despliegue de múltiples imágenes superpuestas. Para permitir la superposición de imágenes (overlay) debe existir algún mecanismo para la especificación de transparencia en la base de cada imagen, cada tira, o cada pixel. En la práctica, la transparencia usualmente se controla a través de la adición de información a cada elemento de los datos de pixel.

La forma más simple de permitir la superposición de imágenes es la adición de un overlay bit (bit de superposición) a cada valor de pixel. Establecer el bit de superposición en una área de una imágen permite a la aplicación de renderización o dispositivo de salida, ignorar selectivamente aquellos valores de pixel con el bit activado. Un ejemplo es la variante de 16 bits del formato TGA, que soportan datos en el formato:

(15 bits) = (R,G,B) = (5 bits, 5 bits, 5 bits)

De hecho, este valor de 15 bits está almacenado en 16 bits; un bit extra se reserva el cual puede usarse para soportar la superposición de imágenes:

(R,G,B,T) = (16 bits) = (5 bits, 5 bits, 5 bits, 1 bit superponer)

El creador de la imagen o aplicación de renderización puede cambiar el valor del bit de superposición, que es interpretado por el hardware de salida como un comando para ignorar ese pixel particular. De esta manera, dos imágenes pueden superponerse, y la imagen superior ser ajustada para permitir agujeros a través de los que son visibles porciones de la imagen que está por debajo.

Esta técnica está en uso extendido, pero no es obvio. Una aplicación de renderización puede cambiar selectivamente el valor del bit de superposición en valores de pixel de un color particular. Más específicamente, la aplicación puede desactivar el despliegue de cualquier área de una imagen que sea de un color particular. Por ejemplo, si una aplicación de renderización encuentra una imagen de una persona de pie enfrente de una pantalla de contraste uniformemente iluminada, la aplicación puede cambiar los bits de superposición de todos los valores de pixeles que son del color de la pantalla, dejando una imagen de una persona cortada del fondo. La imagen cortada puede entonces superponerse en cualquier otra imagen, efectivamente agregando la imagen de la persona a la imagen que está por debajo.

Esto asume, por supuesto, que el color de la pantalla es diferente de cualquier otro color en la porción de la imagen donde está la persona. Esto a menudo es como los reporteros del clima en la televisión son superpuestos en mapas de fondo y pantallas, por ejemplo. Ciertas convenciones heredadas de la tecnología de transmisión analógica tradicional están en uso extendido en la industria de la transmisión, incluyendo el uso de un tono particular de azul para pantallas de fondo. Cuando se usan de esta manera, el proceso es llamado chromakeying.

Un mecanismo más elaborado para especificar superposición de imágenes permite variaciones en la transparencia entre la imagen inferior y la superpuesta. En lugar de tener un único bit de información de superposición, cada valor de pixel tiene más (usualmente ocho bits). Un ejemplo es la variante de 32 bits del formato TGA, el cual también soporta datos en el formato:

(24 bits) = (R,G,B) = (8 bits, 8 bits, 8 bits)

Ya que este valor de pixel de 24 bits se almacena en 32 bits, se dejan 8 bits extra para soportar la transparencia:

(R,G,B,T) = (8 bits, 8 bits, 8 bits, 8 bits de transparencia)

Los ocho bits de transparencia son a menudo llamados el canal alfa. Aunque hay algunas complicaciones en el formato TGA, un canal alfa ideal de 8 bits puede soportar 256 niveles de transparencia, desde cero (que indica que el pixel está pensado para ser totalmente transparente) a 255 (que indica que el pixel está pensado para ser opaco).

Los datos de transparencia usualmente se almacenan como parte de los datos de pixel, como en el ejemplo anterir, pero también pueden aparecer como un cuarto plano, almacenado de la misma manera que datos de paleta en archivos de formato planares. Puede, sin embargo, almacenarse como un bloque separado, independiente de otra información de imagen y paleta, y con las mismas dimensiones que la imagen en cuestión. Esto permite la manipulación de los datos de transparencia independientes de los datos de imagen del pixel.

Para Más Información

En este capítulo, hemos podido tocar solo una pequeña parte de la ciencia de los gráficos de computadora y las imágenes. Para información adicional, consulta las referencias citadas a continuación.

Libros Sobre Gráficos de Computadora

Los siguientes libros son algunos de los mejores textos disponibles sobre el tema de los gráficos de computadora. Muchos de ellos contienen capítulos detallados sobre áreas específicas de aplicación, tales como imágenes, ray tracing, animación, arte, diseño asistido por computadora y modelado 3D.

Artwick, Bruce A., Applied Concepts in Microcomputer Graphics, Prentice-Hall, Englewood Cliffs, NJ, 1984.

Conrac Corporation, Raster Graphics Handbook, second edition, Van Nostrand Reinhold Company, New York, NY, 1985.

Foley, James. D., Andries van Dam, S.K. Feiner, and J. F. Hughes, Computer Graphics: Principles and Practice, second edition, Addison-Wesley, Reading, MA, 1990.

Hearn, Donald and M. Pauline Baker, Computer Graphics, Prentice-Hall, Englewood Cliffs, NJ, 1986.

Netravali, Arun N. and Barry G. Haskell, Digital Pictures: Representation and Compression, Plenum Press, New York, NY, 1988.

Newman, William N. and Robert F. Sproull, Principles of Interactive Computer Graphics, second edition, McGraw Hill, New York, NY, 1973.

Rogers, David F. and J. Alan Adams, Mathematical Elements for Computer Graphics, second edition, McGraw Hill, New York, NY, 1990.

Rogers, David F., Procedural Elements for Computer Graphics, McGraw Hill, New York, NY, 1985.

Rosenfeld, Azriel and Avinash C. Kah, Digital Picture Processing, second edition, Academic Press, San Diego, CA, 1982.

Sharpe, L., "Tiling: Turning Unwieldy Drawings into Neat Little Packets," Inform, Association for Image and Information Management, March 1989.

Watt, Alan, Fundamentals of Three-Dimensional Computer Graphics, Addison-Wesley, Reading, MA, 1989.



Libros Sobre Color y Colorimetría

Los siguientes libros son trabajos de referencia excelentes sobre el color, su medición, y sus efectos en el sistema humano psico-biológico.

Benson, K. Blair, Television Engineering Handbook, second edition, McGraw Hill, New York, NY, 1986.

Billmeyer, Fred W. and Max Saltzman, Principles of Color Technology, second edition, John Wiley & Sons, New York, NY, 1981.

De Grandis, Luigina, Theory and Use of Color, translated by John Gilbert, Harry N. Abrams, Inc., New York, NY, 1986.

Foley, James. D., Andries van Dam, S.K. Feiner, and J.F. Hughes, Computer Graphics: Principles and Practice, second edition, Addison-Wesley, Reading, MA, 1990.

Hunt, R.W.G., Measuring Color, second edition, E. Horwood, New York, NY, 1991.

Hunt, R.W.G., The Reproduction of Color, third edition, John Wiley & Sons, New York, NY, 1975.

Hunt, R.W.G., The Reproduction of Color in Photography, Printing and Television, Fountain Press, Tolworth, England, 1987.

Judd, Deane B., Color in Business, Science, and Industry, third edition, John Wiley & Sons, New York, NY, 1975.

Kueppers, Harald, Color; Origin, Systems, Uses, translated by Bradley, F., Von Nostrand Reinhold Ltd., London, England, 1973.

Optical Society of America, Committee on Colorimetry, The Science of Color , Washington, DC, 1963.

Wyszecki, Gunter and W.S. Stiles, Color Science: Concepts and Methods, Quantitative Data and Formulae , second edition, John Wiley & Sons, New York, NY, 1982.



 n0HCo(-JT' &N5i5詗7c'wOưQ|c!@|%A"@[0d1̖Y'zb,5͔Ow( 2+FcI`Fqlzv(7LX rfYvNzzYOA#.E-94Zn!S 52@K9my;.}U݀r&jn2WWHJ`Q}u_tro {rWL;=_ؼ