Search code examples
delphianimationgifanimated-gifdelphi-xe7

Retrieve the first frame from a large GIF (in optimal time)


I need to obtain the first frame from an animated GIF file. This is easy to achieve by loading the file in a TGIFImage object:

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

The problem is that for (large) animated GIF files this takes a while... my computer needs 12 seconds and a LOT of RAM to load a 50MB file.

I was hoping that I will be able to pass the file to TCustomGIFRenderer and extract the first frame. But TCustomGIFRenderer only operates on 'live' (in memory) GIF images.

Is it possible to get only the first frame without loading the whole file?


Solution

  • Have you tried 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;
    

    You might also want to try 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).

    In both cases (GDI+/WIC) only the first GIF frame will be extracted.