Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Convertir un color a valores RGB de 16bits en VB

Iniciado por [EX3], 01 de Enero de 2003, 04:50:33 PM

« anterior - próximo »

[EX3]

                                Nas y Feliz Año a tod@s:

Estoy implementando una funcion para extraer los componentes RGB de un color devuelto por la funcion GetPixel() de DirectDraw en Visual Basic.

La conversion en 32Bits de color funciona perfectamente, pero cuando ejecuto la funcion en 16Bits, como es logico, el resultado de GetPixel() es diferente y la conversion a RGB no es correcta.

¿Como puedo hacer una conversion de color a RGB en 16Bits que sea fiable?

Salu2...

[EX3]                                
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

HgH

                               
Citar"]
Nas y Feliz Año a tod@s:
Igualmente :D

Citar"]
¿Como puedo hacer una conversion de color a RGB en 16Bits que sea fiable?

El modo de 16 bits típico (D3DFMT_R5G6B5) tiene 5 bits de rojo, 6 de verde y 5 de azul.
Para esto, en vb y si no me falla la memoria sería algo como

Function GetR(RGB As Long) As Byte
   GetR = (RGB And &H1F)
End Function
------------------------------------------
Function GetG(RGB As Long) As Byte
   GetG = (RGB And &H7E0) / 32
End Function
------------------------------------------
Function GetB(RGB As Long) As Byte
   GetB = (RGB And &HF800) / 2048
End Function
------------------------------------------

Si el formato de pixel es otro como D3DFMT_X1R5G5B5,D3DFMT_A1R5G5B5, etc,etc, tendrías que comprobarlo y cambiar las máscaras.

PD: No me acuerdo si en vb hay instrucciones para rotado de bits. Si es así cámbia las divisiones por rotaciones.                                
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -

[EX3]

                                Gracias por contestar  :)

He probado tu codigo en mi programa que uso para probar la funcion de derivado a RGB y este es el resultado:

Color  /  32 Bits   /     16 Bits
--------------------------------
Rojo   /   255,0,0   /    0,0,31
Verde  /  0,255,0   /    0,63,0
Azul   /    0,0,255   /    31,0,0
Amarillo / 255,255,0  /  0,63,31
Blanco / 255,255,255 / 31,63,31

No se si por ser 16 Bits tiene que devolver esos valores, si no es asi seguro que con alguna operacion matematica se pueden cuadrar los resultados con los obtenidos en 32 Bits.
Lo de que el valor de rojo aparezca en el azul y viceversa es un problema que ya experimente, pero que tiene facil solucion.

Sea como sea, mas o menos, ya podria trabajar con la lectura de color en 16 Bits, algo es algo, muchas gracias por la ayuda  :D.

Salu2...

[EX3]                                
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

HgH

                               
Citar"]
Color  /  32 Bits   /     16 Bits
--------------------------------
Rojo   /   255,0,0   /    0,0,31
Verde  /  0,255,0   /    0,63,0
Azul   /    0,0,255   /    31,0,0
Amarillo / 255,255,0  /  0,63,31
Blanco / 255,255,255 / 31,63,31

Ups, pequeño (gran) fallo. GetR está devolviendo el componente B y GetB el R.
Los valores son correctos. Ten en cuenta que el valor máximo para una componente de un pixel de 16 bits es 31 en el caso de R y B (son 5 bits-> 2^5 = 32 -> de 0 a 31) y 63 (2^6=64)  en el caso del componente G. Si quieres trabajar con valores de 0 a 255, en cualquier caso, desplaza los componentes R y B 5 bits a la izquierda y el G 6 bits.

Saludos                                
gH _ TLOTB
..................
"No queremos estar obligados, por nada ni nadie, a pensar sólo en lo que es más comercial. Siempre seremos, antes que nada, programadores"

- Equipo de Zigurat -






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.