int Rcolor;
int Gcolor;
int Bcolor;
int iColorFull ;
// Calculamos el color a emplear.
Rcolor = Rcolor << 11;
Gcolor = Gcolor <<5;
iColorFull = Rcolor|Gcolor|Bcolor;
// Calculamos el color a emplear.
Rcolor = (Rcolor & 0x1f) << 11;
Gcolor = (Gcolor & 0x3f) <<5;
iColorFull = Rcolor|Gcolor|(Bcolor & 0x1f);
No se si serán paranoyas mías pero con la función R4R3R2R1R0G5G4G3G2G1G0B4B3B2B1B0 yo he entendido que hay que coger 5 bits del rojo, 6 bits del verde y 5 bits del azul y si no les haces la máscara entonces se van a mezclar.
chiva:
Si cada color sólo tiene su color no tiene por qué mezclarse
RGB tiene una gama de 16,7 millones, cada uno de los colores básicos puede ir desde el 0 hasta el 255 por lo que es necesario un byte para cada color. Con lo cual si queremos guardarlo en 16 bit, se debe de limitar el rango de los colores básicos para que así no se mezclen. Por eso yo he hecho la máscara, para limitarlos.
Aún así creo que lo ideal no sería hacer una máscara, sino poner un numero proporcional a cada uno de los colores básicos, limitando el rango de 0 a 31. No se cómo se verá ya que limitamos mucho el rango total de colores de 16,7 millones a 29791.
Si estoy equivocado agradecería que me corrigieran.
Buneo, parece que avanzamos:
Resulta que no se puede emplear un RGB = 150, 150, 150 (por ejemplo)
ya que con los cinco bits asignados al color Red y al color Blue, solo llegas a 31 en decimal. Con 150 desbordamos los cinco bits.
Por eso, para que mi texto vaya desde gris claro hasta negro, poco a poco, para hacer el fundido al negro que necesito, hay que usar siempre valores menores de 31 para todos ellos:
Como he comentado en mi post anterior, podrias probar a pasar los valores que lees a 255 haciendo una regla de tres. Pero entonces los valores que obtengas daran saltos de 8 en 8.
RGB es un espacio de color que tiene infintos colores, pero como esto es imposible implementarlo en la práctica, se usan distintas profundidades de color, siendo la de 24 y 32 bits las más comúnes en pantallas de ordenadores. Como los microcontroladores no gozan de tanta memoria y velocidad de procesamiento, se puede usar una profundidad de 16 bits, como la de la pantalla a la que hace referencia el post, lo que nos da una totalidad de 65536 colores.
A lo que me refería con lo de mezclarse, es que si los 3 bits altos del rojo y azul y los 2 del verde son siempre cero, como debieran, no hay que enmascarar nada.
A mi personalmente no me gusta enmascarar por que sí, sin necesidad alguna, ya que esconde fallos, pero si te manejas mejor así, pues tu mismo
Si trabajas con colores RGB con 8 bits para cada color (24 bits) y lo quieres pasar al formato comprimido de 16 bits tienes que tener en cuenta lo siguiente:
El rojo va a pasar de 8 a 5 bits (desaparecen 3 bits).
El verde pasa de 8 a 6 bits (desaparecen 2 bits).
El azul pasa de 8 a 5 bits (desaparecen 3 bits).
Los bits que tienes que quedarte son los mas significativos (los de la izquierda), desechando los menos significativos (los de la derecha).
La formas mas rápida de hacer esto es con desplazamientos: