我需要从动画 GIF 文件中获取第一帧。通过将文件加载到 TGIFImage 对象中,可以轻松实现这一点:
GIF.LoadFromFile(FileName)
BMP.Assign(GIF)
问题是,对于(大型)动画 GIF 文件,这需要一段时间...我的计算机需要 12 秒和大量 RAM 来加载 50MB 文件。
我希望能够将文件传递给 TCustomGIFRenderer 并提取第一帧。但 TCustomGIFRenderer 只能对“实时”(内存中)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;
您可能还想尝试TWICImage (对于较新的 Delphi 版本)。对于没有内置 TWICImage
的旧 Delphi 版本,请参阅此问题:Delphi 2007 using Windows Imaging Component (WIC) .
在这两种情况下(GDI+/WIC),只会提取第一个 GIF 帧。
关于delphi - 从大 GIF 中检索第一帧(在最佳时间内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44332339/