如何将GIF图像按比例缩小,并保存 ( 积分: 200 )

  • 主题发起人 主题发起人 lanyaoshi
  • 开始时间 开始时间
L

lanyaoshi

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,在论坛上找了不少代码,都是缩放BMP、JPG的,没找到缩放GIF的,没找到好的方法前,只能用PHOTOSHOP手工处理了,累呀,希望大家能给些建议。
 
你用的是不是 TGifimage, 里面可以用 Frames, 将每个 Frames取出来, Resize, 再保存, 所有的Frames 保存为新的 Gif。
 
感谢xuxiaohan,我是用TGifimage显示,在哪里可以找到Frames?如何操作呢,能否写几句代码呢。谢谢了。
 
我现在提议你看看GifImage 的 源代码, 因为时间比较紧,等我空闲一点的时候,给你写的个demo。
 
学习了...
 
在xuxiaohan的指点之下,又参考了论坛中缩放BMP图片的代码,终于可以缩放GIF图片了,高兴之余,将代码公布如下,不知还有没有更好的代码?再次感谢xuxiaohan,是他指出了GIF有Frames,让我猜到了Frames对应是TGIFImage类的属性Images,其它的就容易了,如果不点破这点,打死我也写不出来呀。有时总感觉写代码时总少点什么,看来有时间要好好看看WINDOWS基础之类的东西了,不然代码总是东抄西抄。


procedure ZoomBmp(SrcBitmap, DestBitmap: TBitmap; const NewWidth, NewHeight: Integer);
var
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
try
Bmp.Width := NewWidth;
Bmp.Height := NewHeight;
SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE); //加此句效果好
StretchBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
SrcBitmap.Canvas.Handle, 0, 0, SrcBitmap.Width, SrcBitmap.Height, SRCCOPY);
DestBitmap.Assign(Bmp);
finally
if Assigned(Bmp) then
Bmp.Free;
end;
end;


procedure TfrmEditData_Maindb.lvImageFileNamesChange(Sender: TObject;
Item: TListItem; Change: TItemChange);
var
FileName: string;
AGIFImage: TGIFImage;
i: Integer;
OldBmp, NewBmp: TBitmap;
NewWidth, NewHeight: Integer;
begin
if Item <> nil then
begin
FileName := clsGlobe.Globe.ImageDir + FArrImageInfo[Item.Index].FileName;
imgOldImage.Picture.LoadFromFile(FileName);
lblImageSize.Caption := Format('图片大小:宽:%d,高:%d', [imgOldImage.Picture.Width, imgOldImage.Picture.Height]);

AGIFImage := TGIFImage.Create;
try
AGIFImage.LoadFromFile(FileName);
NewWidth := round(AGIFImage.Width * 0.5);
NewHeight := round(AGIFImage.Height * 0.5);
for i := 0 to AGIFImage.Images.Count - 1 do
begin
OldBmp := AGIFImage.Images.Bitmap;
NewBmp := imgNewImage.Picture.Bitmap;
ZoomBmp(OldBmp, NewBmp, NewWidth, NewHeight);
AGIFImage.Images.Bitmap := NewBmp;
end;
AGIFImage.Width := NewWidth;
AGIFImage.Height := NewHeight;
AGIFImage.SaveToFile('c:/Temp.gif');
finally
if Assigned(AGIFImage) then
AGIFImage.Free;
end;
end;
end;
 
这个方法有个缺点,GIF修改后,如果再缩放后再保存,会出错。
 
ACDSee看图工具就可以呀。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部