PDA

Ver la Versión Completa : Novato (Redimensionar imagen)


enecumene
05-06-2006, 18:05:30
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:


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:


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 (http://www.clubdelphi.com/foros/showthread.php?t=31642) anterior:


// 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:

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:


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.