Como obtener el código de color en 16bits (65.536 colores)

Started by FreeYourMind, July 19, 2010, 06:16:57 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Buenas, Bomber ya me ha dado una ayudita hace tiempo para descubrir el código de color de un determinado color rgb en modo 8bits (256 colores).

Es algo así:

mi_paleta = load_pal("Fichero.fpg");
pal_get(mi_paleta, 0, 256, &color);
palette = mi_paleta;
 
FROM i1 = 0 to 767 step 3;
// Ejemplo: Saber el código de color correspondiente a RGB Blanco: [248, 252, 248]
IF (color[i1] == 248 AND color[i1 + 1] == 252 AND color[i1 + 2] == 248) say(i1); END
END

Pues bien, he intentado hacer lo miso para un fpg de 16 bits (con su ajuste de dimensión), pero no encuentra el respectivo registro.


Aparte de esto tengo otras dudas, en modo 16 bits, al poner un put_pixel(x, y, color); el color es un numero de 0 a 65535, pero al hacer un color = map_get_pixel(...) de un gráfico del fpg de 16bits, parece que el color devuelto viene como si fuera de 8bits, o sea, en un rango de 0 a 255, este no deberia ser el mismo rango de 0 a 65535 ?
O sea si por ejemplo con map_get_pixel obtengo el color = 16, este es verde claro (porque en el png del fpg que lo obtengo si lo habro con el paint es exactamente ese color que tiene), pero si hago despúes un put_pixel con el color 16, este va pintar un pixel azul (lo que es logico porque es el color 16 de 0 a 65535) pero a traves del map_get_pixel este era de color verde claro...

A que se debe esto ?















Prg

??

si lo que quieres es obtener el codigo de color usa rgb

para saber el codigo de color de 8 bits tambien funciona find_color()

QuoteBYTE FIND_COLOR ( R, G, B )  
Busca un color en la paleta que se aproxime al deseado

PARÁMETROS  
BYTE R :  Valor deseado de componente rojo
BYTE G :  Valor deseado de componente verde
BYTE B :  Valor deseado de componente azul


para 16 y 32 bits usa

QuoteDWORD rgb ( <BYTE red> , <BYTE green> , <BYTE blue> )
[edit] Description

Finds the single color in the current color mode closest to the combined red, green, and blue values specified. In 32bit mode, the alpha is set to 255.

Equal to rgba(red,green,blue,255)


QuoteNotes

Different color depths have different color codes, this is why rgb() is useful: it returns the appropriate code, based on the current color depth. When in 8bit mode, this code is 0..255 and when in 16bit mode 0..65535. In 32bit mode the code is 0xRRGGBBAA, two letters meaning one byte.

Using this function in different color depths can be tricky. This is because rgb() will return a different color code under different color depths. For example, when at 8bit, we do:

my_color = rgb(100,100,100);

my_color will most likely have the value 6 at this time. Suppose we change the color depth to 16bit now, using set_mode(). Now, my_color holds a totally different color than before, as 6 is nowhere near rgb(100,100,100) in 16bit mode. To counter this effect, my_color needs to be reinitialized:

my_color = rgb(100,100,100);

The same code, but rgb() now returns the proper code, as it always returns the code belonging to the current color depth. my_color will now be about 25388.

para 32 bits con alpha usa rgba(...)

lo que comentas del fpg solo se me ocurre que el fpg sea de 8 bits en realidad. puedes subirlo?
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

FreeYourMind

El fichero es de 16 bits (uso el FPG edit y lo he creado con el), incluso he separado las fuentes en uno de 8 bits para poder usar el FOR que he puesto, ya que cambio el color a las fuentes durante el juego.

Voy a probar con la desconocida rgba.

El map_get_pixel funciona como te he dicho, y aunque cambie el modo al iniciar a 8 bits, como en este modo no se ven los png's (la pantalla se queda negra), se que aún sigue comprobando el color correctamente en el mapa de durezas con el mismo código de color (porque oigo el sonido de las colisiones al encontrar y colisionar con el color obtenido con map_get_pixel).

Muchas grácias.

FreeYourMind

Yupiiii, ya lo tengo mil grácias.


Buscaba este gris: RGB[200, 204,  216], que obtuve con

say(rgba(200, 204,  216, 255));

--> color = 52859

que es un color aproximado, ya que he vuelto al paint con la imagen generada en una captura al lado de la original, y esta tiene RGB[206, 207, 222] respectivamente :)

SplinterGU

rgba es con alpha, funciona tambien en 16 si mal no recuerdo, pero en 16 podes usar rgb que son los componentes del color pero para 16bits.

con respecto al pal_get, la situacion es que los mapas 16 y 32 no tienen paletas.

te sugiero investigues en wikipedia "palette index color" y "rgb", ahi lo encontraras bien explicado, mejor de lo que yo podria hacerlo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2