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

Retrieve the first frame from a large GIF (in optimal time)

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

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

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

我希望能够将文件传递给 TCustomGIFRenderer 并提取第一帧。但 TCustomGIFRenderer 仅对 'live'(在内存中)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 (for newer Delphi version). For older Delphi version which do not have TWICImage build-in, see this Q: Delphi 2007 using Windows Imaging Component (WIC)

在这两种情况下 (GDI+/WIC) 只会提取第一个 GIF 帧。