Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Novato (Redimensionar imagen) (https://www.clubdelphi.com/foros/showthread.php?t=32407)

enecumene 05-06-2006 18:05:30

Novato (Redimensionar imagen)
 
Saludos!!!

tengo un problema, usos paradox 7 y delphi 7, en mi aplicacion cargo imagenes jpeg en un timage y todo funciona perfecto se carga y se muestra, pero que la imagen se muestra mas grande que el tamaño del timage, como hago para que la imagen tenga el mismo tamaño del TImage? aqui os dejo mi codigo para cargar imagen:

Código Delphi [-]
procedure TForm3.mnuLoadClick(Sender: TObject);
var
    Jpg: TJpegImage;
    Stream: TMemoryStream;
    FileExt: string;
    GraphType: TGraphType;
  begin
    if dlgOpenPicture.Execute then begin
      Jpg := nil;
      Stream := nil;
      try
        Stream := TMemoryStream.Create;
        FileExt := LowerCase(ExtractFileExt(dlgOpenPicture.FileName));
        if (FileExt = '.bmp') or (FileExt = '.dib') then begin
          GraphType := gtBitmap;
          Stream.Write(GraphType, 1);
          with Image1.Picture.Bitmap do begin
            LoadFromFile(dlgOpenPicture.FileName);
            Image1.Picture.Bitmap.SaveToStream(Stream);
          end;
        end else if (FileExt = '.ico') then begin
          GraphType := gtIcon;
          Stream.Write(GraphType, 1);
          with Image1.Picture.Icon do begin
            LoadFromFile(dlgOpenPicture.FileName);
            Image1.Picture.Bitmap.SaveToStream(Stream);
          end;
        end else if (FileExt = '.emf') or (FileExt = '.wmf') then begin
          GraphType := gtMetafile;
          Stream.Write(GraphType, 1);
          with Image1.Picture.Metafile do begin
            LoadFromFile(dlgOpenPicture.FileName);
            Image1.Picture.Bitmap.SaveToStream(Stream);
          end;
        end else if (FileExt = '.jpg') or (FileExt = '.jpeg')
           or (FileExt = '.jpe') then begin
          Jpg := TJpegImage.Create;
          Jpg.LoadFromFile(dlgOpenPicture.FileName);
          Image1.Picture.Assign(Jpg);
          GraphType := gtJpeg;
          Stream.Write(GraphType, 1);
          Jpg.SaveToStream(Stream);
        end;
        if (tblPeliculas.State <> dsEdit) and (tblPeliculas.State <> dsInsert) then
          tblPeliculas.Edit;
        Stream.Position := 0;
        TBlobField(tblPeliculas.FieldByName('Imagen')).LoadFromStream(Stream);
      except
        jpg.Free;
        Stream.Free;
        raise;
      end;
      jpg.Free;
      Stream.Free;
    end;
end;

espero que me puedan ayudar y hayan podido entender mi duda.

gracias!!!!

Sick boy 05-06-2006 18:44:01

Pues no entiendo si quieres redimensionar la imagen, o que la imagen se ajuste al Timage.

Para lo segundo usa image.strech:=true;
Y si tambien quieres que quede proporcional, image.proportional:=true;

Por cierto, usa las etiquetas para codigo delphi.

Y me parece que le das muchas vueltas para cargar una imagen, no te sirve imagen.loadfromfile(archivo)??
Es tan importante soportar tantos formatos distintos?? Para mi, los que abre un TImage con loadfromfile son más que suficientes.

Si quieres redimensionar la imagen, el tema es más largo, pero los pasos son:
1.- Pasar el jpg a bmp
2.- Redimensiona el bmp (hay cantidad de funciones)
3.- Pasa de bmp a jpg y guarda el archivo.

Saludos

seoane 05-06-2006 18:57:43

Bien antes de nada, creo que le das muchas vueltas, con algo asi creo que obtendriamos el mismo resultado:

Código Delphi [-]
var
  GraphType: TGraphType;
  Stream: TMemoryStream;
begin
  if dlgOpenPicture.Execute then
    with Image1.Picture do
    begin
      LoadFromFile(dlgOpenPicture.FileName);
      if Graphic is TBitmap then GraphType:= gtBitmap else
      if Graphic is TIcon then GraphType:= gtIcon else
      if Graphic is TMetafile then GraphType:= gtMetafile else
      if Graphic is TJPEGImage then GraphType:= gtJpeg;
      Stream:= TMemoryStream.Create;
      try
        Stream.WriteBuffer(GraphType, 1);
        Graphic.SaveToStream(Stream);
        // Aqui lo de la base de datos
        {
        if (tblPeliculas.State <> dsEdit) and (tblPeliculas.State <> dsInsert) then
          tblPeliculas.Edit;
        Stream.Position := 0;
        TBlobField(tblPeliculas.FieldByName('Imagen')).LoadFromStream(Stream);
        }
      finally
        Stream.Free;
      end;
    end;
end;

Ahora volvamos al tema de tu pregunta, si lo que quieres es que a la hora de mostrar la imagen esta se ajuste al tamaño del TImage echale un vistzao en la ayuda a las propiedades Stretch y Proportional del TImage que creo pueden darte el efecto que buscas.

Si por el contrario quieres redimensionar la imagen puedes usar alguan de estas funciones que ya describi en un hilo anterior:

Código Delphi [-]
// Esta cambia el alto y ancho, estirando la imagen si es necesario
procedure Redimensionar(Imagen: TGraphic; Ancho, Alto: Integer);
var
  Bitmap: TBitmap;
begin
  Bitmap:= TBitmap.Create;
  try
    Bitmap.Width:= Ancho;
    Bitmap.Height:= Alto;
    Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,Imagen);
    Imagen.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;

// Esta otra mantiene la relacion entre alto y ancho
procedure Proporcional(Imagen: TGraphic; Ancho, Alto: Integer);
var
  Bitmap: TBitmap;
begin
  Bitmap:= TBitmap.Create;
  try
    if  (Ancho/Imagen.Width) < (Alto/Imagen.Height) then
      Alto:= Trunc((Ancho*Imagen.Height)/Imagen.Width)
    else
      Ancho:= Trunc((Imagen.Width*Alto)/Imagen.Height);
    Bitmap.Width:= Ancho;
    Bitmap.Height:= Alto;
    Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect,Imagen);
    Imagen.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;

Combinando los dos codigos anteirores nos quedaria algo como esto:
Código Delphi [-]
var
  GraphType: TGraphType;
  Stream: TMemoryStream;
begin
  if dlgOpenPicture.Execute then
    with Image1.Picture do
    begin
      LoadFromFile(dlgOpenPicture.FileName);
      // Aqui puedes usar Proporcional o Redimensionar 
     Proporcional(Graphic,Image1.Width,Image1.Height);
      if Graphic is TBitmap then GraphType:= gtBitmap else
      if Graphic is TIcon then GraphType:= gtIcon else
      if Graphic is TMetafile then GraphType:= gtMetafile else
      if Graphic is TJPEGImage then GraphType:= gtJpeg;
      Stream:= TMemoryStream.Create;
      try
        Stream.WriteBuffer(GraphType, 1);
        Graphic.SaveToStream(Stream);
        // Aqui lo de la base de datos
        {
        if (tblPeliculas.State <> dsEdit) and (tblPeliculas.State <> dsInsert) then
          tblPeliculas.Edit;
        Stream.Position := 0;
        TBlobField(tblPeliculas.FieldByName('Imagen')).LoadFromStream(Stream);
        }
      finally
        Stream.Free;
      end;
    end;
end;

Ten en cuenta que este ultimo codigo si modifica el tamaño real de la imagen y la imagen se guardara con el tamaño cambiado

Sick boy 05-06-2006 19:13:52

Seoane, muy buenas las funciones que pones, no conocia StretchDraw!!

Te ahorras el paso de jpg a bmp. Y funciona con más tipos de imagenes, pero yo solo admito jpg y bmp, y al final, siempre convierto la imagen a jpg aplicando la compresión que me interese, ya que los usuarios a veces intentan cargar imagenes enormes o con minima compresión. Ahorro muchos bytes con este paso.

Saludos

seoane 05-06-2006 19:29:41

:o Lamentablemente no soportan tantos tipos de archivo, con wmf o ico no funciona, mas concretamente en esta sentencia:

Código Delphi [-]
Imagen.Assign(Bitmap);

Ya que no se puede asignar un Bitmap a un icono o un wmf. Si queremos usar este tipo de archivos tendriamos que guardar el resultado en jpg o bmp y no en el formato original.


La franja horaria es GMT +2. Ahora son las 22:38:23.

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