2017-06-02 32 views
3

我需要从动画GIF文件中获取第一帧。这很容易通过在TGIFImage对象加载文件来实现:从一个大的GIF(在最佳时间)检索第一帧

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

的问题是,(大)动画GIF文件这需要一段时间......我的电脑需要12个秒的RAM来了很多加载一个50MB的文件。

我希望能够将文件传递给TCustomGIFRenderer并提取第一帧。但TCustomGIFRenderer只能在'live'(在内存中)GIF图像上运行。

是否有可能只加载第一帧而不加载整个文件?

+0

如果您可以实现自己的'TCustomGIFRenderer'变体读取文件流,我不会感到惊讶。 –

+2

也许我应该为TGIFImageList写一个'hack'类,其中我重写了LoadFromStream(Stream:TStream)并在读取第一帧后立即停止从GIF文件读取数据? – Ampere

+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(对于较新的德尔福版本)。对于没有TWICImage内建版的旧版Delphi版本,请参阅此问:Delphi 2007 using Windows Imaging Component (WIC)

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

相关问题