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

标签 delphi animation gif animated-gif delphi-xe7

我需要从动画 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/

相关文章:

iOS动画 View 包括 subview

javascript - 更改 jquery show()/hide() 动画?

javascript - 如何制作多种颜色的指示器

javascript - 如何从 youtube 视频制作 gif 图像?

delphi - TRadioGroup 具有可包装的项目

delphi - 如何在C++ Builder XE6中部署大量文件?

xml - Delphi IXMLNode FindNode 不适用于命名空间

ios - 动画完成后执行任务(在 iOS 中)

android - 使用Glide Android播放带有音频的Gif

delphi - 印地上传速度