高分求解怎么修改GIF的图象大小?急啊,可再开贴给分!

onehawk 2005-04-25 09:55:27
我用TGifImage来修改Gif的大小
虽然能正确修改图象大小,但是有一个NewGif的对像的资源却不能正确释放(会报错),搞了好久没搞定,请问哪位高手知道原因的?怎么改?
或是谁知道还有什么别的方法修改Gif 图片大小?
下面的是我用的函数,别人写的。
function PicZoom(const SourceFile, DeskFile: WideString;
nWidth, nHeight: Integer; bDelSource: WordBool): WordBool;
var
xRat, yRat: Real;
Gif: TGifImage;
newGif: TGifImage;
Bmp: TBitmap;
i, nIndex: Integer;
Stream: TMemoryStream;
Parent:TGIFSubImage;
begin
newGif := TGifImage.Create;
Bmp := TBitmap.Create;
Gif := TGifImage.Create;
Gif.LoadFromFile(SourceFile);
xRat := nWidth / Gif.Width;
yRat := nHeight / Gif.Height;

try
try
//for i := 0 to Gif.Images.Count - 1 do
i:=0;
begin
Bmp.Assign(Gif.Images[i]);
Bmp.FreeImage;
if (Gif.Images[i].Width = 0) or (Gif.Images[i].Height = 0) then continue;

Bmp.Width := Trunc(Int(Gif.Images[i].Bitmap.Width * xRat));
Bmp.Height := Trunc(Int(Gif.Images[i].Bitmap.Height * yRat));

Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect, Gif.Images[i].Bitmap);
newGif.Add(Bmp);

//添加GIF的扩展信息
for nIndex := 0 to Gif.Images[i].Extensions.Count - 1 do
newGif.Images[i].Extensions.Add(Gif.Images[i].Extensions.Items[nIndex]);

{//begin
Stream:=TMemoryStream.Create;
Gif.Images[i].Extensions.SaveToStream(Stream);
newGif.Images[i].Extensions.LoadFromStream(Stream,newGif.Images.SubImages[i]);
Stream.Free;
//end; }

newGif.Images[i].Left := Trunc(Int(Gif.Images[i].Left * xRat));;
newGif.Images[i].top := Trunc(Int(Gif.Images[i].Top * yRat));
end;

newGif.Compression := gcLZW;
newGif.SaveToFile(DeskFile);
if bDelSource then
DeleteFile(SourceFile);
Result := true;
finally
FreeAndNil(Gif);
FreeAndNil(Bmp);
FreeAndNil(newGif);//这一句出错
end;
end;
except
Result := false;
end;
end;
...全文
336 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
onehawk 2005-05-09
  • 打赏
  • 举报
回复
newlife2005(新生活) 正解
虽然我已经在别的地方找到这个原因了
不过还是很感谢你
同时感谢大家捧场
哈哈
newlife2005 2005-04-30
  • 打赏
  • 举报
回复
finally
FreeAndNil(newGif);//这句出错
FreeAndNil(Gif);
FreeAndNil(Bmp);
end;

帮你试了,按上述顺序改一下即可,先FREE newGIF!
constantine 2005-04-28
  • 打赏
  • 举报
回复
mark
zsuswy 2005-04-26
  • 打赏
  • 举报
回复
同情一下楼主,
顺便顶一下!
onehawk 2005-04-25
  • 打赏
  • 举报
回复
发错函数了,下面的这个才是原来的

function PicZoom(const SourceFile, DeskFile: WideString;
nWidth, nHeight: Integer; bDelSource: WordBool): WordBool;
var
xRat, yRat: Real;
Gif: TGifImage;
newGif: TGifImage;
Bmp: TBitmap;
i, nIndex: Integer;
begin
newGif := TGifImage.Create;
Bmp := TBitmap.Create;
Gif := TGifImage.Create;
Gif.LoadFromFile(SourceFile);
xRat := nWidth / Gif.Width;
yRat := nHeight / Gif.Height;

try
try
for i := 0 to Gif.Images.Count - 1 do
begin
Bmp.Assign(Gif.Images[i]);
Bmp.FreeImage;
if (Gif.Images[i].Width = 0) or (Gif.Images[i].Height = 0) then continue;

Bmp.Width := Trunc(Int(Gif.Images[i].Bitmap.Width * xRat));
Bmp.Height := Trunc(Int(Gif.Images[i].Bitmap.Height * yRat));

Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect, Gif.Images[i].Bitmap);
newGif.Add(Bmp);

for nIndex := 0 to Gif.Images[i].Extensions.Count - 1 do
newGif.Images[i].Extensions.Add(Gif.Images[i].Extensions.Items[nIndex]);

newGif.Images[i].Left := Trunc(Int(Gif.Images[i].Left * xRat));;
newGif.Images[i].top := Trunc(Int(Gif.Images[i].Top * yRat));
end;

newGif.Compression := gcLZW;
newGif.SaveToFile(DeskFile);
if bDelSource then
DeleteFile(SourceFile);
Result := true;
finally
FreeAndNil(Gif);
FreeAndNil(Bmp);
FreeAndNil(newGif);//这句出错
end;
end;
except
Result := false;
end;
end;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧