Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Convertir Color Rgb A Entero Y Viceversa (sdl) ?¿

Iniciado por J_F_NASH, 01 de Noviembre de 2005, 11:43:48 AM

« anterior - próximo »

J_F_NASH

 ¿Cómo puedo saber a que numero entero corresponde un color RGB y viceversa?.
Bueno, espero no haber preguntado una estupidez :unsure:.


S2.

MA]Mestre

 Normalmente suelen haber macros para realizar estas labores. Te pongo un ejemplo en C de como se podria realizar lo que pides, suponemos que los valores int son de 32bits.

rgb a entero:

int entero=0,r=255,g=128,b=128;

entero=r;
entero=entero<<8;
entero=entero | g;
entero=entero<<8;
entero=entero | b;

entero a rgb:

r = entero >> 16;

g = entero << 8;
g = g >> 16;

b = entero & 255;

Un saludo.

TheAzazel

 Concretamente, en SDL puedes utilizar estas dos funciones que van asociadas a el formato de la superficie, el codigo que te pusieron arriba vale para una superfice de 32bits... pero usando estas funciones, te olvidas de todo jeje:


void SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b);

Description

Get RGB component values from a pixel stored in the specified pixel format.

This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).



Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b);

Description

Maps the RGB color value to the specified pixel format and returns the pixel value as a 32-bit int.

If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.

If the specified pixel format has an alpha component it will be returned as all 1 bits (fully opaque).


Tambien tienes las mismas pero terminadas con una A para las superficies con informacion alpha.

Saludos

J_F_NASH

Cita de: "MAMestre"] Normalmente suelen haber macros para realizar estas labores. Te pongo un ejemplo en C de como se podria realizar lo que pides, suponemos que los valores int son de 32bits.

rgb a entero:

int entero=0,r=255,g=128,b=128;

entero=r;
entero=entero<<8;
entero=entero | g;
entero=entero<<8;
entero=entero | b;

entero a rgb:

r = entero >> 16;

g = entero << 8;
g = g >> 16;

b = entero & 255;

Un saludo.
Aunque voy ha hacerlo con las funciones que indica TheAzazel si me me gustaría entender esto que pones:
entero=entero<<8;
entero=entero | g;

¿Qué significa estas 2 lineas?. Concretamente "<<" y "|". Creo haber leido algo sobre "moverte a nivel de píxeles", pero la verdad ni idea.

Bueno, gracias, es todo lo que necesitaba saber.


S2.

_Grey

 Puede que parezca divertido esto:
Citar¿Qué significa estas 2 lineas?. Concretamente "<<" y "|". Creo haber leido algo sobre "moverte a nivel de píxeles", pero la verdad ni idea.

Pero lo que seria un LOLompico es que este trabajando en modo paleta.

--8<------------------------------------

Pasando a lo serio...

"<<" es un desplazamiento de bits a la izquierda, un desplazamiento "logico". Lo de logico es importante, pero solo para los desplazamientos a la derecha ">>" ya que rellenaran los bits "entrantes" con 1 o 0 segun si el bit mas significativo(el del extremo izquierdo) es uno 1 o 0, para mantener el signo del numero.

"|" es la expresion OR logica, que se realiza sobre 2 operandos, y deja pasar los bits que esten a 1.
Por ejemplo:
char a=1;   // bits 00000001
char b=2;   // bits 00000010
char c=a|b;// bits 00000011
Es algo asi como el complemento de "&".
Todo esto es de bajo nivel, digamos, la parte sucia de programar en C.

Por cierto, el ejemplo de MA]Mestre, te servira en un modo de 32bits o de 24bits, donde los componentes de color de un pixel se encuentran como 0x00rrggbb(32bits), 0xrrggbb(24bits), donde rr es el componente rojo, gg verde, bb azul(en hexadecimal). Cuidado al leer los modos de 24bits, en 32bits puedes leer de DWORD(doble palabra 32bits) en DWORD, pero en modos de 24bits tendras que leer cada pixel en grupos de 3 bytes o alternando WORD(16bits) y un byte.

En caso de trabajar en modos de 16bits la cosa se complica, cada pixel seran 2 bytes, facil de leer con WORD's, pero hay basicamente 2 modos de 16bits, unos que usan 5bits por cada componente de color, asi 0rrrrrgggggbbbbb (cada caracter es un BIT) y modos con 5 para rojo 6 para verde y 5 para azul, asi rrrrrggggggbbbbb(Creo que en un libro de LaMothe comenta que es asi por que el ojo es mas sensible al verde, pero juraria que en los semaforos el rojo es el de parar por que se ve de mas lejos.....pero ya es otro tema).


Espero que no estes usando un modo de paleta, por que no se que te hariamos....  B)
...
...
.
.
.
........

je je je


Ahora que me acuerdo.... cuidado al leer modos de 32bits o 24, byte a byte, por que en memoria de forma secuencial esta primero azul, depues verde y finalmente rojo.... la magia del little endian y el big endian, pero ya es complicar este mucho no?! ;P

Tambien intenta resolver las cosas por ti mismo antes de preguntar, por mucho que nos veas preguntando cosas simples alguna vez, antes nos lo miramos bien.

Finalmente me gustaria comentar lgo en lo que no he podido mas que fijarme, en tus posts. Casi me extraña que te traten tan bien, normalmente a los posts tan basicos los critican, de hecho yo pase de contestar en un principio. Tampoco te tomes esto a mal, no se si seras el boubou que hace un tiempo paso por aqui, pero aun que asi sea deja un poco de hacer esto, seguramente eres muy joven, no tienes por que saberlo todo o hacer grandes proyectos de golpe, tienes mucho tiempo por delante. Yo te recomendaria que empollaras bien algun libro de C/C++, sacaras mucho probecho de el, por mucho que sepas hacer algun programa por aprender de forma autodidactica te faltara la base y te veras haciendo preguntas simples de que es "<<" o "|" (o OR, me a salido un chiste! B) ), empolla bien los libros, metete despues en hacer algo mas o menos grandecito, incluso te recomendaria que le dieras a algun libro de ASM, asi sabrias como trabaja la maquina por dentro ,controlarias y comprenderias mejor todo esto de trabajar a nivel de bits, y como se almacena la informacion en memoria, y leer la informacion que preguntabas seria coser y cantar. Aparte de que si te gusta esto te lo tendrias que pasar bien.

Bueno creo que todo esto ya es suficiente, saludos.

Ray

 Aprender bien el C deberías hacer desde un principio y luego le vas dando caña al C++ al tiempo que haces juegos. Pilla un libro de C y practica cada simbolo, operadores, palabras clave, etc. tampoco son tantos aunque duelen bastante a lo primero, tambien practica con los tipos de numeración binaria y hexadecimal y las operaciones lógicas.

Te pongo un ejemplo de lo que pedías para ver si te aclara un poco más:

DWORD r=255, g=128, b=64;
DWORD dwColor=  (r<<16)  |  (g<<8)  |  b;

r=255 = 0xFF al desplazarlo 16 bits se convierte en 0xFF0000
g=128= 0x80 al desplazarlo 8 bits se convierte en 0x8000
b=64  = 0x40  no hay que desplazarlo por lo tanto vale 0x40

al hacer una operación lógica de tipo OR sobre ellos nos da:

0xFF0000 | 0x008000 | 0x000040 = 0xFF8040 = 16744512

al reves lo mismo pero desplazandolos hacia el lado contrario y haciendo una operacion AND para quedarnos con el byte o componente de color que nos interesa

DWORD dwColor=0xFF8040

DWORD r = (dwColor >> 16) & 0xFF;
DWORD g = (dwColor >> 8) & 0xFF;
DWORD  b= (dwColor) & 0xFF;

_Grey

 
Citar"<<" es un desplazamiento de bits a la izquierda, un desplazamiento "logico"

Como que LOGICO!? es un desplazamiento ARITMETICO, zoquete!(si, es a mi), tanto el << como el >> (el desplazamiento a la izquierda, es igual, tanto para el logico como el aritmetico, pero es otra historia...).
sorry.

Saludos.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.