我需要从动画GIF文件中获取第一帧。通过在TGIFImage对象中加载文件很容易实现:
GIF.LoadFromFile(FileName)
BMP.Assign(GIF)
问题是,对于(大)动画GIF文件,这需要一段时间......我的计算机需要12秒钟和大量RAM才能加载50MB文件。
我希望我能够将文件传递给TCustomGIFRenderer并提取第一帧。但是,TCustomGIFRenderer仅在“直播”中运行。 (在内存中)GIF图像。
是否可以在不加载整个文件的情况下仅获取第一帧?
答案 0 :(得分:2)
你试过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;
您可能还想尝试TWICImage(对于较新的Delphi版本)。对于没有TWICImage
内置版本的旧版Delphi版本,请参阅此问:Delphi 2007 using Windows Imaging Component (WIC)。
在这两种情况下(GDI + / WIC),只会提取第一个GIF帧。