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]
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.
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]
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