Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Imagen blanco y negro (https://www.clubdelphi.com/foros/showthread.php?t=30330)

yorllito 03-04-2006 22:03:02

Imagen blanco y negro
 
:confused: Hola nuevamente compañeros foristas. Espero y me puedan ayudar con el siguiente problema: Tengo un "Timage" y en su propiedad "picture" tengo cargada una imagen .jpge. Ahora bien ¿es posible que al pasar el ratón por encima de la imagen, esta cambie de color a blanco y negro?. Si es posible espero y me puedan decir cómo. Gracias por adelantado. Por cierto, utilizo delphi 7.

marcoszorrilla 03-04-2006 22:18:19

Prueba esto a ver si lo solucionas:
Código Delphi [-]
#45: How can I convert color value into gray-scaled color value?

If you want to convert a colored image into same gray scaled, then you must convert the color of the each pixel by the next schema:

function RgbToGray(Source: TColor) : TColor;
var Target: Byte;
begin
  Target := Round((0.30 * GetRValue(Source)) +
        (0.59 * GetGValue(Source)) +
        (0.11 * GetBValue(Source)));
  Result := RGB(Target, Target, Target);
end;

Un Saludo.

seoane 04-04-2006 00:17:09

1 Archivos Adjunto(s)
Para manipular una imagen contenida en un TImage es necesario que este contenga un Bitmap, asi que si lo que hay es una imagen jpg tenemos un problema, pero todo tiene solucion.

Una solucion rapida seria usar Bitmaps en vez de Jpegs, pero supongo que esta no es la solucion que esperabas :)

La otra solucion que se me ocurre es cargar la imagen jpg y convertirla en un bitmap antes de asignarla al TImage para asi poder manejarla sin problemas.

Seria algo asi
Código Delphi [-]
var
  jpg: TJPEGImage;
  bmp: TBitmap;
begin
  if dlgOpen.Execute then
  begin
    try
      jpg:= TJPEGImage.Create;
      bmp:= TBitmap.Create;
      try
        jpg.LoadFromFile(dlgOpen.FileName);
        bmp.Assign(jpg);
        Imagen.Picture.Assign(bmp);
      finally
        jpg.Free;
        bmp.Free;
      end;
    except
      ShowMessage('No puedo abrir la imagen');
    end;
  end;
end;

Luego para convertirla a gris yo usaria el clasico sumar y dividir, aunque aqui cada uno aplica el que mas le gusta:
Código Delphi [-]
type
  Triple = array[1..3]of Byte;

procedure TfrmMain.btnGrisClick(Sender: TObject);
var
  P: ^Triple;
  i,j: Integer;
begin
  with Imagen.Picture do
  begin
    Bitmap.PixelFormat:= pf24bit;
    for j:= 0 to Bitmap.Height - 1 do
    begin
      P:= Bitmap.ScanLine[j];
      for i:= 0 to Bitmap.Width - 1 do
      begin
        P^[1]:= (P^[1] + P^[2] + P^[3]) div 3;
        P^[2]:= P^[1];
        P^[3]:= P^[1];
        inc(P);
      end;
    end;
  end;
  Imagen.Refresh;
end;

Por ultimo te dejo un pequeño ejemplo, con uno de los botones cargas una jpg y con el otro vuelves la imagen en tonos de gris.

dec 04-04-2006 18:29:52

Hola,

Me pregunto si no se podría utilizar la propiedad "GrayScale" del objeto "jpg", es decir, utilizando el método "btnCargarClick" que arriba propone el compañero, que la cosa quedara más o menos así, de forma que no fuera necesario el método "btnGrisClick". ¿No os parece?

Código Delphi [-]
procedure TfrmMain.btnCargarClick(Sender: TObject);
var
  jpg: TJPEGImage;
  bmp: TBitmap;
begin
  if dlgOpen.Execute then
  begin
    // Hay que cargar la imagen asi porque necesitamos un bitmap
    btnGris.Enabled:= FALSE;
    try
      jpg:= TJPEGImage.Create;
      bmp:= TBitmap.Create;
      try
        jpg.LoadFromFile(dlgOpen.FileName);

        jpg.Grayscale := true;

        bmp.Assign(jpg);
        Imagen.Picture.Assign(bmp);
        btnGris.Enabled:= TRUE;
      finally
        jpg.Free;
        bmp.Free;
      end;
    except
      ShowMessage('No puedo abrir la imagen');
    end;
  end;
end;

yorllito 04-04-2006 23:13:50

Gracias
 
Gracias por sus soluciones compañeros. Creo que todas funcionaron pero he encontrado una muy sencilla buscando aquí en los foros. es la siguiente.

Código Delphi [-]
TJPEGImage(Image1.Picture.Graphic).GrayScale := True;

Gracias nuevamente.


La franja horaria es GMT +2. Ahora son las 07:12:34.

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