Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从大GIF中检索第一帧(在最佳时间)_Delphi_Animation_Gif_Animated Gif_Delphi Xe7 - Fatal编程技术网

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

Delphi 从大GIF中检索第一帧(在最佳时间),delphi,animation,gif,animated-gif,delphi-xe7,Delphi,Animation,Gif,Animated Gif,Delphi Xe7,我需要从动画GIF文件中获取第一帧。通过将文件加载到TGIFImage对象中很容易实现这一点: GIF.LoadFromFile(FileName) BMP.Assign(GIF) 问题是,对于(大型)动画GIF文件,这需要一段时间。。。我的电脑需要12秒和大量的内存才能加载50MB的文件 我希望能够将文件传递给tcustomgif渲染器并提取第一帧。但TcustomGif渲染器仅对“实时”(内存中)GIF图像进行操作 是否可以只获取第一帧而不加载整个文件 你试过GDI+吗 uses

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

  GIF.LoadFromFile(FileName)
  BMP.Assign(GIF)
问题是,对于(大型)动画GIF文件,这需要一段时间。。。我的电脑需要12秒和大量的内存才能加载50MB的文件

我希望能够将文件传递给tcustomgif渲染器并提取第一帧。但TcustomGif渲染器仅对“实时”(内存中)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;
您可能还想试试(对于较新的Delphi版本)。对于没有内置
TWICImage
的较旧的Delphi版本,请参见以下Q:


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

如果您可以实现自己的
TCustomGIFRenderer
变体,从文件流中读取,我不会感到惊讶。也许我应该为tgiMageList编写一个“hack”类,在其中覆盖LoadFromStream(stream:TStream)在我读取第一帧后立即停止读取GIF文件?我想找一个第三方库来实现这一点。