kotai
09-03-2007, 18:32:15
Hola.
Estoy modificando el color de una imagen y para ello saco pixel a pixel el color que tiene lo modifico y lo vuelvo a poner.
Cuando lo tengo puesto en 32 bits va a la perfección, me devuelve una variables de 24 bit y saco los tres componentes R G B de cada pixel usando 8 bits para cada uno, pero cuando estoy en 16 bits de color lo que me devuelve son 16 bits y si intento sacarle los colores RGB me da valores para R y G más altos de lo que debe y 0 para B (cosa lógica ya que tengo solo 16 bits y estoy sacando 8, 8 y 8)
¿Alguien sabe como puedo convertir un TColor de 16 bits a 24 bits para poder sacarle el R,G,B ?
El código es el siguiente (GetPixel16 cuando BitCount = 16 y GetPixel32 cuando BitCount = 32)
ColorPixel := DXImageList.Items[103].PatternSurfaces[0].GetPixel16(X, Y);
R := GetRValue(ColorPixel);
G := GetGValue(ColorPixel);
B := GetBValue(ColorPixel);
también he probado con:
ColorPixel := ColorToRGB(DXImageList.Items[103].PatternSurfaces[0].GetPixel16(X, Y));
Pero me pasa lo miso, devuelve solo 16 bits.
El código de GetPixel es:
function TDirectDrawSurface.GetPixel16(x, y: integer): integer; assembler;
// on entry: self = eax, x = edx, y = ecx, result = eax
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,1
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
and eax,$FFFF // map into 16bit
pop esi
//ret
end;
function TDirectDrawSurface.GetPixel32(x, y: integer): integer; assembler;
{ on entry: self = eax, x = edx, y = ecx, result = eax }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,2
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
pop esi
//ret
end;
Haciendo pruebas obtengo estos valores:
32 bits de color:
ColorPixel = 9005609 --> 896A29
R = 41 --> 29
G = 106 --> 6A
B = 137 --> 89
y el mismo pixel pero con la configuración de windows a 16 bits
ColorPixel = 35653 --> 8B45
R = 69
G = 139
B = 0 :confused:
Saludos.
Estoy modificando el color de una imagen y para ello saco pixel a pixel el color que tiene lo modifico y lo vuelvo a poner.
Cuando lo tengo puesto en 32 bits va a la perfección, me devuelve una variables de 24 bit y saco los tres componentes R G B de cada pixel usando 8 bits para cada uno, pero cuando estoy en 16 bits de color lo que me devuelve son 16 bits y si intento sacarle los colores RGB me da valores para R y G más altos de lo que debe y 0 para B (cosa lógica ya que tengo solo 16 bits y estoy sacando 8, 8 y 8)
¿Alguien sabe como puedo convertir un TColor de 16 bits a 24 bits para poder sacarle el R,G,B ?
El código es el siguiente (GetPixel16 cuando BitCount = 16 y GetPixel32 cuando BitCount = 32)
ColorPixel := DXImageList.Items[103].PatternSurfaces[0].GetPixel16(X, Y);
R := GetRValue(ColorPixel);
G := GetGValue(ColorPixel);
B := GetBValue(ColorPixel);
también he probado con:
ColorPixel := ColorToRGB(DXImageList.Items[103].PatternSurfaces[0].GetPixel16(X, Y));
Pero me pasa lo miso, devuelve solo 16 bits.
El código de GetPixel es:
function TDirectDrawSurface.GetPixel16(x, y: integer): integer; assembler;
// on entry: self = eax, x = edx, y = ecx, result = eax
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,1
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
and eax,$FFFF // map into 16bit
pop esi
//ret
end;
function TDirectDrawSurface.GetPixel32(x, y: integer): integer; assembler;
{ on entry: self = eax, x = edx, y = ecx, result = eax }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,2
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
pop esi
//ret
end;
Haciendo pruebas obtengo estos valores:
32 bits de color:
ColorPixel = 9005609 --> 896A29
R = 41 --> 29
G = 106 --> 6A
B = 137 --> 89
y el mismo pixel pero con la configuración de windows a 16 bits
ColorPixel = 35653 --> 8B45
R = 69
G = 139
B = 0 :confused:
Saludos.