从大型GIF中检索第一帧(在最佳时间内)

时间:2017-06-02 15:19:58

标签: delphi animation gif animated-gif delphi-xe7

我需要从动画GIF文件中获取第一帧。通过在TGIFImage对象中加载文件很容易实现:

  GIF.LoadFromFile(FileName)
  BMP.Assign(GIF)

问题是,对于(大)动画GIF文件,这需要一段时间......我的计算机需要12秒钟和大量RAM才能加载50MB文件。

我希望我能够将文件传递给TCustomGIFRenderer并提取第一帧。但是,TCustomGIFRenderer仅在“直播”中运行。 (在内存中)GIF图像。

是否可以在不加载整个文件的情况下仅获取第一帧?

1 个答案:

答案 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帧。