从大型 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 帧。
我需要从动画 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 帧。