Representación digital del color mediante el sistema RGB (RVA - Rojo, Verde y Azul)

Entendiendo el color y el sistema RGB

Copyright © 2002 Ernesto De Spirito

Este artículo fue primero publicado en el Boletín para Desarrolladores de Software

Boletín Pascal. Newsletter gratuito para programadores Delphi (y Kylix) con artículos, noticias, trucos, componentes y enlaces a nuevo contenido Delphi en la red.

Índice

Boycott Trend Micro!

Colores primarios de la luz

La luz tiene tres colores primarios: rojo, verde y azul. Combinando esos colores primarios en diversas intensidades podemos conseguir todos los colores visibles.

Si representamos la intensidad de cada color primario con un número, entonces podemos representar los colores con tres números (uno para el rojo, uno para el verde y uno para el azul). Esta forma de representar los colores con números para la intensidad de los componentes rojo, verde y azul de la luz se conoce como el sistema de color RGB (del inglés Red, Green y Blue, que en castellano suele referirse como RVA: Rojo, Verde y Azul).

El sistema de color RGB (RVA)

Asumiendo que utilizamos números enteros en el rango 0..255 (un byte), es decir 256 valores posibles para cada color primario, entonces con tres bytes podemos representar 256 x 256 x 256 combinaciones diferentes de los colores primarios, es decir una gama de más de 16 millones de colores (frecuentemente referida como "color verdadero"). En particular, este sistema de color RGB se conoce como RGB-256.

Algunos programas utilizan un sistema conocido como RGB-100, que utiliza números en el rango 0..100 para indicar un porcentaje de intensidad (0%=apagado; 100%=máximo). En los ejemplos vamos a utilizar RGB-256 porque es el más popular.

Tonos de grises

El negro es la ausencia de color (o la ausencia de luz) y se representa como RGB(0,0,0) (Rojo=0, Verde=0, Azul=0). El blanco es la presencia de todos los colores (en su intensidad máxima) y se representa entonces como RGB(255,255,255) (Rojo=255, Verde=255, Azul=255). Todos los tonos de grises del negro al blanco se representan con tres valores iguales para los componentes rojo, verde y azule (ningún color predomina), es decir que tienen la forma RGB(x, x, x). Por ejemplo, el color definido en la jerga como "gris claro" se representa como RGB(192,192,192), y el "gris oscuro" es RGB(128,128,128).

RGB(0,0,0) = Negro
RGB(128,128,128) = Gris oscuro
RGB(192,192,192) = Gris claro
RGB(255,255,255) = Blanco

Colores primarios

Ahora pasemos a los colores. Para comenzar, los colores primarios se representan de esta manera:

RBG(255,0,0) = Rojo claro (o rojo brillante, o rojo intenso)
RBG(0,255,0) = Verde claro (o verde brillante, o verde intenso)
RBG(0,0,255) = Azul claro (o azul brillante, o azul intenso)

Sus versiones oscuras serían:

RBG(128,0,0) = Rojo oscuro
RBG(0,128,0) = Verde oscuro
RBG(0,0,128) = Azul oscuro

Como puede estar adivinando, las diferentes intensidades de rojo tienen la forma RBG(x,0,0), las de verde tienen la forma RGB(0,x,0) y las de azul son de la forma RGB(0,0,x).

Colores secundarios

Los colores secundarios de la luz son cian, magenta y amarillo, y resultan de la combinación de diferentes pares de los colores primarios en iguales intensidades. Por ejemplo, sus versiones brillantes serían:

RBG(0,255,255) = Cian claro = verde claro + azul claro
RBG(255,0,255) = Magenta claro = rojo claro + azul claro
RBG(255,255,0) = Amarillo claro = rojo claro + verde claro

La versiones oscuras de los colores secundarios serían:

RBG(0,128,128) = Cian oscuro = verde oscuro + azul oscuro
RBG(128,0,128) = Magenta oscuro = rojo oscuro + azul oscuro
RBG(128,128,0) = Amarillo oscuro = rojo oscuro + verde oscuro

Como puede ver, las diferentes intensidades de cian son de la forma RBG(0,x,x), las de magenta tienen la forma RGB(x,0,x) y las de azul son de la forma RGB(x,x,0).

Otros colores

¿Cómo podemos hacer otros colores? Tomemos el naranja por ejemplo. Como probablemente sabrá, el naranja intenso es un color que está entre el rojo intenso y el amarillo intenso, es decir, entre el RGB(255,0,0) y el RGB(255,255,0), y esto significa que el naranja intenso es RGB(255,128,0). ¿Cómo obtuvimos este valor? Simplemente tomando el promedio de los componentes del rojo intenso y el amarillo intenso:

           Rojo claro  Amarillo claro
  Rojo  = (    255   +     255      ) / 2 = 255
  Verde = (     0    +     255      ) / 2 = 128
  Azul  = (     0    +      0       ) / 2 = 0
RGB(255,0,0) = Rojo claro
RBG(255,128,0) = Naranja claro
RBG(255,255,0) = Amarillo claro

Diferentes intensidades de naranja tienen la forma RGB(x,x/2,0), es decir, guardan la relación entre rojo y verde (dos partes del primero y uno del segundo).

Colores puros

Los colores puros o saturados combinan sólo dos colores primarios y tienen la forma RGB(x,y,0), RGB(y,x,0), RGB(0,x,y), RGB(0,y,x), RGB(x,y,0) o RGB(y,x,0) donde x <> 0 y x >= y:

  • Cuando y = 0, tenemos un color primario.
  • Cuando x = y, tenemos un color secundario.
  • Cuando y = x/2 tenemos un color exactamente entre un color primario y un color secundario. Por ejemplo RGB(255,128,0) es un naranja exactamente entre el rojo y el amarillo.
  • Cuando y < x/2 tenemos un color más cercano a un color primario que a uno secundario. Por ejemplo el RGB(255,116,0) es un naranja más tirando a rojo que a amarillo.
  • Cuando y > x/2 tenemos un color más cercano a un color secundario que a uno primario. Por ejemplo el RGB(255,140,0) es un naranja más cerca del amarillo que del rojo.

Matiz y luminosidad

Los colores de la misma forma que tienen la misma relación x/y se dice que tienen el mismo "matiz". Por ejemplo, RBG(255,128,0) y RGB(192,96,0) son de la misma forma (RGB(x,y,0)) y tienen la misma relación x/y (255/128 = 192/96), así que tienen el mismo matiz. El "matiz" es lo que incorrectamente con frecuencia referimos como "color". Por ejemplo, en este caso el matiz de ambos colores es "naranja", pero es naranja brillante y el otro es naranja oscuro, es decir, comparten el mismo "matiz", pero difieren en la "luminosidad". La luminosidad mide cuán cercano un color está del blanco, y se representa usualmente como un porcentaje. Por ejemplo, RGB(192,96,0) es un naranja con una luminosidad de 75%, y RBG(128,64,0) es un naranja con una luminosidad de 50%.

RBG(255,128,0) = Naranja 100% luminosidad
RGB(192,96,0) = Naranja 75% luminosidad
RBG(128,64,0) = Naranja 50% luminosidad

El matiz de RBG(0,0,128) y de RGB(0,0,64) es el azul, pero el segundo color tiene un 50% de la luminosidad del primero (tienen una luminosidad de 50% y 25% respectivamente).

Saturación

Aparte del matiz y la luminosidad, los colores se definen por un tercer parámetro conocido como "saturación", que mide la pureza de un color. Hasta aquí hemos tratado con colores 100% puros. Los colores impuros son colores puros mezclados con gris. Mientras menos mezclado con gris, más saturado es un color. Por ejemplo, RGB(192,128,64) tiene el mismo matiz y luminosidad que el naranja brillante RGB(255,128,0), pero un 50% de saturación, y resulta de mezclar el naranja brillante con el gris medio RGB(128,128,128):

           naranja  gris
  Rojo  = (  255  + 128 ) / 2 = 192
  Verde = (  128  + 128 ) / 2 = 128
  Azul  = (   0   + 128 ) / 2 = 64

Si nuevamente mezclamos el resultado con gris medio, obtendríamos un naranja con 25% de saturación RGB(160,128,96), aún más cercano al gris medio. Si lo mezclamos con gris otra vez, obtendremos un naranja con una saturación de sólo un 12,5% RGB(144,128,112), casi un gris medio.

RBG(255,128,0) = Naranja claro 100% saturación
RGB(192,128,64) = Naranja claro 50% saturación
RGB(160,128,96) = Naranja claro 25% saturación
RGB(144,128,112) = Naranja claro 12,5% saturación
RGB(128,128,128) = Gris medio

Nótese que un color es más saturado cuando la diferencia entre los valores RGB es más grande. Cuando los valores RGB son más cercanos unos de otros, el color es menos saturado (es decir, es más grisáceo, o podemos decir que es menos "saturado", "vivo", "vívido" o "puro").

La saturación se puede calcular con la siguiente fórmula:

  Saturación = ((máximo-medio) + (medio-mínimo)) / 255 * 100%

Por ejemplo:

  Saturación(160,128,96) = ((160-128) + (128-96)) / 255 * 100%
                         = (32 + 32) / 255 * 100%
                         = 64 / 255 * 100%
  Saturación(160,128,96) = 25%

Representación entera

Los tres bytes que representan un color se pueden combinar en una constante entera de 32-bit, representada normalmente en notación hexadecimal. Por ejemplo, RGB(160,128,96) es 6080A0:

  Rojo  (RR) = 160 decimal = A0 hexadecimal
  Verde (GG) = 128 decimal = 80 hexadecimal
  Azul  (BB) =  96 decimal = 60 hexadecimal

Nótese que las constantes de color tienen la forma BBGGRR, donde BB es el byte (dos dígitos hexadecimales) para el azul (blue), GG es el byte para el verde (green) y RR es el byte para el rojo (red). La razón es que los enteros se almacenan con el byte menos significativo primero, así que BBGGRR se almacena como RRGGBB, el orden en que se esperan los valores RGB (por ejemplo 6080A0 se almacena internamente como A08060).

En Visual Basic, RGB(160,128,96) se representa como &H6080A0&, en C/C++ es 0x6080A0 y en Delphi es $6080A0.

Añadiendo color a sus aplicaciones

El uso de los colores del sistema de Windows garantiza que el usuario puede ajustar los colores de su aplicación a aquellos que él/ella puede ver (su aplicación simplemente usará los colores establecidos en el Panel de Control). Considere este hecho antes de pensar en usar sus propios colores. A propósito, puede encontrar algunas pautas útiles sobre el uso del colores en la MSDN Library:

 http://msdn.microsoft.com/library/en-us/dnwue/html/ch14b.asp

Está bien, a veces queremos que nuestra aplicación tenga un pequeño toque de color, pero por otra parte no queremos que se vea cirquera. El secreto es limitarse a un puñado de colores, ser consistentes, y elegir colores muy impuros con poco contraste entre fondos adyacentes (y altos contrastes entre las letras y los fondos).

Por ejemplo, para el fondo de sus botones puede utilizar un color como RGB(192,192,200), que es como el gris claro original, pero con un poco de azul. Recuerde que cuando usted no utiliza un color del sistema para el fondo de un elemento, no debe utilizar un color del sistema para el primer plano. Por ejemplo, probablemente usted ve que las letras de una etiqueta son negras, que contrasta muy bien contra el fondo gris azulado claro que ha establecido, pero éste puedo no ser el caso en la PC del usuario. ¿Qué pasa si el usuario tiene establecido en el Panel de Control un color claro para las letras sobre un fondo oscuro para los colores de los botones? En su aplicación, el resultado serían letras claras (establecidas por el usuario) sobre un fondo claro (establecido por usted). Por esta razón, usted debe establecer explícitamente el color de las letras para asegurarse que las mismas contrastarán muy bien contra el fondo. En este caso, RGB(0,0,0) -negro- sería la mejor opción.

Puede agrupar diversos elementos de su formulario en paneles, y establecer el color de fondo de estos paneles por ejemplo a RGB(192,200,200), un gris claro con un poco de cian. Si lo desea poco un más verde, puede establecerlo por ejemplo a RGB(192,202,199), y si lo desea poco un más azul, puede establecerlo a RGB(192,199,202). Recuerde establecer explícitamente el color de los letras de las etiquetas que tenga sobre estos paneles a un color que ponga contraste mucho con el fondo (típicamente negro).

Si desea más color, puede establecer el color del fondo de los cuadros de texto a un color luminoso como RGB(255,255,239), un amarillo claro insaturado, y establecer el color del texto a un color muy oscuro (generalmente negro).

RGB(192,192,200) = gris claro con un poco de azul
RGB(192,200,200) = gris claro con un poco de cian
RGB(192,203,198) = ídem, más verde
RGB(192,198,203) = ídem, más azulado
RGB(255,255,239) = un amarillo claro insaturado

Si desea algo radicalmente diferente, en vez del gris claro estándar RGB(192,192,192) para el fondo de su formulario, puede establecer un color mucho más brillante, como RGB(245,245,255), un muy luminoso e insaturado azul claro, casi blanco. Esto permitiría que usted utilizara colores no tan oscuros para algunas etiquetas (típicamente en negrita), como por ejemplo un cian oscuro RGB(0,80,80), etc., mientras que se sigue manteniendo un buen contraste. En vez de un color como RGB(192,200,200) para un panel, debería ahora utilizar un color como RGB(248,242,255) para que el fondo del panel no contraste mucho con el fondo del formulario, y para los botones puede utilizar un color como RGB(232,242,255) por la misma razón.

RGB(192,192,192) = Gris claro
RGB(245,245,255) = Gris más claro con un poco de azul
RGB(248,242,255)
RGB(232,242,255)

Con estos pequeños toques de color y algunos gráficos como decoraciones, su aplicación tendrá un look diferente.

Paleta de seguridad

La paleta de seguridad se usa para asegurar que los colores sean "sólidos" (sin "dithering") en tarjetas de video y monitores capaces solamente de 256 colores. Si quiere que su aplicación se vea bien en estos monitores, debería usar la paleta de seguridad.

La paleta de seguridad se compone de 216 colores que resultan de todas las combinaciones posibles de los valores 0, 51, 102, 153, 204 y 255 (o $00, $33, $66, $99, $CC, y $FF en notación hexadecimal) para los componentes rojo, verde y azul. Por ejemplo, el color RGB(204,153,102) o $6699CC es uno de los colores seguros.

                                         
                                         
                                         
                                         
                                         
                                         

La paleta de seguridad deja 40 colores sin usar (256 - 216 = 40). Windows reserva 20 colores de sistema, dejándole otros 20 colores que podría usar en su aplicación, pero debería estar consciente que esos 20 colores pueden cambiar cuando el usuario cambia a otra aplicación, así que se recomienda que no los use.
 

JfControls Library - para Delphi y C++ Builder