Colores

Los colores se presentan en formato int. Por lo tanto, es necesario hacer algunas cosas complicadas para obtener un int que pueda contener los valores ARGB.

El estándar de los enteros de color

Cambiamos los bits para utilizar el formato TRGB. Para definir un color, lo inicializamos asi 0xTTRRGGBB, Donde cada carácter representa lo siguiente:

LetraDescripcionEjemplo

T

Transparencia

R

Componente rojo

0x00FF0000

G

Componente Verde

0x0000FF00

B

Componente Azul

0x000000FF

Podemos utilizar dos métodos para codificar y decodificar los colores:

  • BitShifting

  • char/int conversion

BitShifting

Dado que cada byte contiene 2^8 = 256 valores (1 byte = 8 bits), y que los valores RGB van de 0 a 255, nos cabe perfectamente un entero (ya que un int son 4 bytes). Para establecer los valores de forma programada utilizamos el desplazamiento de bits. Es decir que un int nos entra perfectamente la combinacion de estos 4 bytes que representan un color.

Para ello utilizaremos la siguiente funcion que nos junta los 4 parametros en un solo integrer, es decir una funcion que nos haga la combinacion de colores:

int	create_trgb(int t, int r, int g, int b)
{	
    return (t << 24 | r << 16 | g << 8 | b);
}

Esta fucnion lo que hace es superponer los 4 int en uno solo, creando una combinacion de sus bites, mediante el operador de bites ( | ). Sin emabrgo antes de ralizar la comparacion para la superposicon de los bits, tenemos que desplazarlos a sus posicones correspondiente para asi a la hora de juntarlos no se superponga uno encima del otro

  • EL byte de trasparencia (T) esta al final del todo, por lo que habra que desplazarlo 24 posiciones hacia la izquierda

  • El byte del rojo (R) habra que despalzarlo 16 bites

  • El byte del Verde (G) habra que despalzarlo 8 bites

  • El byte del azul (B) al ser el ultimo byte, no es necesario depalzarlo

Como puedes ver los desplaamos en 8 en 8, que son los bites que ocupan un byte.

En el caso de que queramos separa la union de estos colores en los 4 parametros (TRGB) habra que utilizar las siguientes funciones:

int	get_t(int trgb)
{
	return ((trgb >> 24) & 0xFF);
}

int	get_r(int trgb)
{
	return ((trgb >> 16) & 0xFF);
}

int	get_g(int trgb)
{
	return ((trgb >> 8) & 0xFF);
}

int	get_b(int trgb)
{
	return (trgb & 0xFF);
}

Estas funciones lo que hacen es comparar el byte correspondiente de cada color con una mascara de zero (0xFF) y de esta manera eliminar los valores sobrantes a nuestro color.

Para que quede mas claro este concepto lo esta explicado en el siguiente vido:

Last updated