Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   No puedo capturar el Color de un Degradado (https://www.clubdelphi.com/foros/showthread.php?t=37089)

Deiv 02-11-2006 15:16:25

No puedo capturar el Color de un Degradado
 
Hola,
Recuerdo que buscando en el foro encontré hace tiempo un post donde explicaban la forma de realizar un degradado, me sirvió de mucho, hoy hice nuevamente esa búsqueda y no tuve suerte (pues no deseaba abrir otro hilo). Y bien, he implementado ese código para capturar el color con el mouse con el código de abajo en un TPanel:
Código Delphi [-]
var
  Form1: TForm1;
  IsScanning: Boolean;

implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
  h,s,b: integer; //Tono, Saturacion, Luminosidad
  i,j: integer;
  x,y,z: integer;
begin
  IsScanning := False;
  Image1.Picture.Bitmap.Width:= 360;
  Image1.Picture.Bitmap.Height:= 256;
  with Image1.Canvas do
    begin
      Brush.Color:= clBlack;
      FillRect(ClipRect);
      b:= 255; // Luminosidad entre 0 y 255
      for h:= 0 to 359 do
        begin
          i:= ((h mod 60) * b) div 60;
          j:= b - i;
          for s:= 0 to 255 do
            begin
              x:= i + ((b-i) * s) div 255;
              y:= j + ((b-j) * s) div 255;
              z:= (b * s) div 255;
              case (h div 60) of
                0: Pixels[h,s]:= RGB(b,x,z);
                1: Pixels[h,s]:= RGB(y,b,z);
                2: Pixels[h,s]:= RGB(z,b,x);
                3: Pixels[h,s]:= RGB(z,y,b);
                4: Pixels[h,s]:= RGB(x,z,b);
                5: Pixels[h,s]:= RGB(b,z,y);
              end;
            end;
        end;
    end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   IsScanning := True;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   IsScanning := False;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
   Clr: TColor;
begin
   If IsScanning = True Then
     begin
        Clr := Image1.Canvas.Pixels[X, Y];
        edtRed.Text:= IntToStr(GetRValue(Clr));
        edtGreen.Text:= IntToStr(GetGValue(Clr));
        edtBlue.Text:= IntToStr(GetBValue(Clr));
        pnlPreview.Color := Clr;
        Edit1.Text:=ColorToString(Clr); //Convierte a Hexadecimal
     end
end;
end.
Bueno la Aplicación funciona bien, solo que el degradado que se dibuja de izquierda a derecha: Rojo, Naranja , Amarillo, Verde, Cyan, Azul, Violeta y Rojo y en la parte inferior todo blanco (lo pueden probar) al recorrer el mouse tanto en la parte inferior el BLANCO como en la derecha el ROJO en mi TPanel (pnlPreview) no me captura estos colores y me muestra otros diferentes, pues Yo necesitaba capturar aquellos colores que a vista se ven en el degradado construido y cargado en la TIMage (con los otros colores no tengo el problema, solo con esos extremos)

¿A que se debe todo ello? ¿Como capturo por favor el blanco de la parte inferior o el color verdadero de la derecha del degradado?

Neftali [Germán.Estévez] 02-11-2006 15:59:29

Cita:

Empezado por Deiv
...al recorrer el mouse tanto en la parte inferior el BLANCO como en la derecha el ROJO en mi TPanel (pnlPreview) no me captura estos colores...

A mi me muestra perfectamente el ROJO de la derecha y el BLANCO de la parte inferior...

Imagen 1 - Imagen 2

seoane 02-11-2006 16:07:13

Recuerdo el mensaje original, se perdió en el ultimo desastre :( . Pero lo puedes encontrar como truco 57 en la sección de trucos.

Pero vamos con tu problema. Puede que sea dar palos de ciego, pero si tienes la propiedad Streach del TImage a true las coordenadas del ratón no se corresponden con las coordenadas del canvas y ahí puede estar el problema. La solución es usar una imagen de 360x256 o traducir las coordenadas del ratón a las del canvas.

Deiv 02-11-2006 18:40:24

Hola,
Sin tener en este momento Delphi a mano, la verdad es que si recuerdo que lo tengo con la propiedad stretch, veré...... como hago eso de traducir las coordenadas, imagino será al tamaño que tengo verdad?

seoane 02-11-2006 18:59:13

Prueba con algo así:
Código Delphi [-]
function RatonAImagenX(Imagen: TImage; x: integer): integer;
begin
  Result:= (x * Imagen.Picture.Width) div Imagen.Width;
end;

function RatonAImagenY(Imagen: TImage; y: integer): integer;
begin
  Result:= (y * Imagen.Picture.Height) div Imagen.Height;
end;

Aunque lo ideal seria no tener que ajustar la imagen, si necesitas un tamaño diferente a 360x256 lo mejor seria cambiar el algoritmo que genera el degradado para ajustarlo al nuevo tamaño. ¿que tamaño necesitas?

Deiv 03-11-2006 13:40:34

Gracias Seoane, no entendí como llamar a dichas funciones; pero:

Mi TIMage tiene el tamaño de 260 x 160

seoane 03-11-2006 13:47:08

Las funciones se utilizan asi, donde tienes esto:

Código Delphi [-]
Clr := Image1.Canvas.Pixels[X, Y];

Coloca esto:
Código Delphi [-]
Clr := Image1.Canvas.Pixels[RatonAImagenX(Image1,X), RatonAImagenY(Image1,Y)];

En cuanto a modificar el algoritmo, déjeme ver si tengo un ratito libre y lo modifico.

seoane 03-11-2006 13:58:50

Bueno pues parece que si tenia tiempo :D , aquí te dejo el algoritmo modificado para crear un degradado de 258x160 (el ancho tiene que ser múltiplo de 6). Espero que te sirva, acuerdate de modificar el tamaño del TImage y poner Streach a FALSE

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  h,s,b: integer; //Tono, Saturacion, Luminosidad
  i,j: integer;
  x,y,z: integer;
begin
  Image1.Picture.Bitmap.Width:= 258;
  Image1.Picture.Bitmap.Height:= 160;
  with Image1.Canvas do
    begin
      Brush.Color:= clBlack;
      FillRect(ClipRect);
      b:= 255; // Luminosidad entre 0 y 255
      for h:= 0 to 257 do
        begin
          i:= ((h mod 43) * b) div 43;
          j:= b - i;
          for s:= 0 to 160 do
            begin
              x:= i + ((b-i) * s) div 160;
              y:= j + ((b-j) * s) div 160;
              z:= (b * s) div 160;
              case (h div 43) of
                0: Pixels[h,s]:= RGB(b,x,z);
                1: Pixels[h,s]:= RGB(y,b,z);
                2: Pixels[h,s]:= RGB(z,b,x);
                3: Pixels[h,s]:= RGB(z,y,b);
                4: Pixels[h,s]:= RGB(x,z,b);
                5: Pixels[h,s]:= RGB(b,z,y);
              end;
            end;
        end;
    end;
end;

Recuerda que al ya no usar la propiedad Streach ya no tienes que preocuparte por las corregir las coordenadas del ratón.

Deiv 03-11-2006 14:57:41

Cita:

Empezado por Seoane
Bueno pues parece que si tenia tiempo :D

:D Gracias Seoane estoy en un CiberCafe Internet, llegando a casa lo probaré

Deiv 03-11-2006 22:06:52

Si, comprobado y repasado, funciona!, algo que llega a un final bonito.... ya parezco de telenovela :D
Gracias


La franja horaria es GMT +2. Ahora son las 02:59:10.

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