2017-06-02 1 views
3

Ich brauche den ersten Frame aus einer animierten GIF-Datei zu erhalten. Dies ist einfach durch das Laden der Datei in einem TGIFImage Ziel zu erreichen:Abrufen des ersten Frames von einem großen GIF (in optimaler Zeit)

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

Das Problem ist, dass für die (große) animierte GIF-Dateien dies eine Weile dauert, ... mein Computer 12 Sekunden und eine Menge RAM muss Laden Sie eine 50 MB-Datei.

Ich hatte gehofft, dass ich in der Lage sein werde, die Datei an TCustomGIFRenderer übergeben und den ersten Frame extrahieren. Aber TCustomGIFRenderer funktioniert nur mit "live" (im Speicher) GIF-Bildern.

Ist es möglich, nur das erste Bild zu erhalten, ohne die ganze Datei zu laden?

+0

Ich wäre nicht überrascht, wenn Sie Ihre eigene 'TCustomGIFRenderer' Variante implementieren könnten, die aus einem Dateistrom liest. –

+2

vielleicht sollte ich eine "Hack" -Klasse für TGIFImageList schreiben, in der ich den LoadFromStream überschreibe (Stream: TStream) und aufhören zu lesen aus der GIF-Datei sofort nachdem ich das erste Bild gelesen habe? – Ampere

+0

Ich würde nach einer Drittanbieter-Bibliothek suchen, die das tun könnte. –

Antwort

2

Haben Sie GDI + versucht.

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; 

Sie möchten vielleicht auch TWICImage (für neuere Delphi-Version) versuchen. Für ältere Delphi-Versionen, die keinen integrierten TWICImage haben, siehe Q: Delphi 2007 using Windows Imaging Component (WIC).

In beiden Fällen (GDI +/WIC) wird nur der erste GIF-Rahmen extrahiert.

Verwandte Themen