Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-03-2007
Avatar de kotai
kotai kotai is offline
Miembro
 
Registrado: mar 2004
Ubicación: Gandia
Posts: 31
Poder: 0
kotai Va por buen camino
ColorToRGB para un TColor de 16 bits.

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)
Código Delphi [-]
ColorPixel := DXImageList.Items[103].PatternSurfaces[0].GetPixel16(X, Y);
R := GetRValue(ColorPixel);
G := GetGValue(ColorPixel);
B := GetBValue(ColorPixel);

también he probado con:
Código Delphi [-]
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:
Código Delphi [-]
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


Saludos.

Última edición por kotai fecha: 09-03-2007 a las 18:34:41.
Responder Con Cita
  #2  
Antiguo 09-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
En el formato de 16bits, la informacion del color se codifica con 5 bits para el rojo y el azul, y 6 para el verde. Para pasar de 24 a 16 bits se eliminan los 3 bits menos significativos de cada canal (o 2 en el caso del Verde).

La funcion siguiente convierte de 24 a 16 bits:
Código Delphi [-]
function RGBTo16bit(R,G,B: Byte): Integer;
begin
  Result:= ((B shr 3) shl 11) + ((G shr 2) shl 5) + (R shr 3);
end;

Para hacer el paso inverso solo tenemos que insertar ceros en las posiciones de los bits que faltan. La siguiente funcion convierte de 16 a 24 bits:
Código Delphi [-]
function ToRGB(Color: Integer): Integer;
begin
  Result:= ((Color and $F800) shl 8) + ((Color and $7E0) shl 5) +
    ((Color and $1F) shl 3)
end;
Ten en cuenta que como en el paso de convertir de 24 a 16 perdemos información, el paso inverso, de 16 a 24, nos devolverá un valor muy aproximado al original, pero no exactamente el mismo valor.
Responder Con Cita
  #3  
Antiguo 09-03-2007
Avatar de kotai
kotai kotai is offline
Miembro
 
Registrado: mar 2004
Ubicación: Gandia
Posts: 31
Poder: 0
kotai Va por buen camino
Genial, va perfecto.

Muchas gracias.

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
convertir un string a tColor Manuel Varios 2 19-08-2006 19:58:24
Operadores para manejo de bits vasgab Varios 2 26-04-2006 17:40:04
Delphi 7 y S.O de 64 Bits senpiterno Varios 3 29-11-2004 23:22:36
¿Cómo guardar el Valor de TColor como un String? nesetru Gráficos 3 27-02-2004 20:21:32
Proyecto Vulcano : Firebird para 64 bits guillotmarc Noticias 0 18-12-2003 14:52:56


La franja horaria es GMT +2. Ahora son las 12:15:58.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi