2017-06-02 33 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幀。

相關問題