Delphi 从大GIF中检索第一帧(在最佳时间)
我需要从动画GIF文件中获取第一帧。通过将文件加载到TGIFImage对象中很容易实现这一点:Delphi 从大GIF中检索第一帧(在最佳时间),delphi,animation,gif,animated-gif,delphi-xe7,Delphi,Animation,Gif,Animated Gif,Delphi Xe7,我需要从动画GIF文件中获取第一帧。通过将文件加载到TGIFImage对象中很容易实现这一点: GIF.LoadFromFile(FileName) BMP.Assign(GIF) 问题是,对于(大型)动画GIF文件,这需要一段时间。。。我的电脑需要12秒和大量的内存才能加载50MB的文件 我希望能够将文件传递给tcustomgif渲染器并提取第一帧。但TcustomGif渲染器仅对“实时”(内存中)GIF图像进行操作 是否可以只获取第一帧而不加载整个文件 你试过GDI+吗 uses
GIF.LoadFromFile(FileName)
BMP.Assign(GIF)
问题是,对于(大型)动画GIF文件,这需要一段时间。。。我的电脑需要12秒和大量的内存才能加载50MB的文件
我希望能够将文件传递给tcustomgif渲染器并提取第一帧。但TcustomGif渲染器仅对“实时”(内存中)GIF图像进行操作
是否可以只获取第一帧而不加载整个文件 你试过GDI+吗
uses GDIPAPI, GDIPOBJ, GDIPUTIL;
procedure TForm1.Button1Click(Sender: TObject);
var
GPImage: TGPImage;
GPGraphics: TGPGraphics;
Bitmap: TBitmap; // first frame
begin
GPImage := TGPImage.Create('D:\animated-tiger.gif');
try
Bitmap := TBitmap.Create;
try
Bitmap.Width := GPImage.GetWidth;
Bitmap.Height := GPImage.GetHeight;
GPGraphics := TGPGraphics.Create(Bitmap.Canvas.Handle);
try
GPGraphics.DrawImage(GPImage, 0, 0, Bitmap.Width, Bitmap.Height);
Image1.Picture.Assign(Bitmap);
finally
GPGraphics.Free;;
end;
finally
Bitmap.Free;
end;
finally
GPImage.Free;
end;
end;
您可能还想试试(对于较新的Delphi版本)。对于没有内置TWICImage
的较旧的Delphi版本,请参见以下Q:
在这两种情况下(GDI+/WIC),只提取第一个GIF帧。如果您可以实现自己的
TCustomGIFRenderer
变体,从文件流中读取,我不会感到惊讶。也许我应该为tgiMageList编写一个“hack”类,在其中覆盖LoadFromStream(stream:TStream)在我读取第一帧后立即停止读取GIF文件?我想找一个第三方库来实现这一点。