Это решение для версии 2.X, доступное для загрузки с http://www.tolderlund.eu/delphi/ Для кадров Gir можно установить различные методы удаления. Приведенный ниже подход не поддерживает это, но он отлично работает для большинства GIFS.
Gif := TGifImage.Create;
Gif.LoadFromFile('test.gif');
Bmp := TBitmap.Create;
Bmp.PixelFormat := pf24bit;
Bmp.Width := Gif.Width;
Bmp.Height := Gif.Height;
for i:=0 to Gif.Images.Count-1 do begin
if GIF.Images[i].Empty then Continue; //skip empty
Gif.Images[i].Bitmap.TransparentColor := Gif.Images[i].GraphicControlExtension.TransparentColor;
if i <> 0 then Gif.Images[i].Bitmap.Transparent := True;
//you should also take care of various disposal methods:
//Gif.Images[i].GraphicControlExtension.Disposal
Bmp.Canvas.Draw(0,0, Gif.Images[i].Bitmap);
Bmp.SaveToFile('out/' + IntToStr(i) + '.bmp');
end;
Другим решением является использование TGIFPainter, но тогда он не будет работать во всех oop.
* 1008. *
И решение для версии 3.X очень просто:
Gif := TGifImage.Create;
Gif.LoadFromFile('test.gif');
Bmp := TBitmap.Create;
Bmp.PixelFormat := pf24bit;
Bmp.Width := Gif.Width;
Bmp.Height := Gif.Height;
GR := TGIFRenderer.Create(GIF);
GR.Animate := True;
for i:=0 to Gif.Images.Count-1 do begin
if GIF.Images[i].Empty then Continue; //skip empty
GR.Draw(Bmp.Canvas, Bmp.Canvas.ClipRect);
GR.NextFrame;
Bmp.SaveToFile('out/' + IntToStr(i) + '.bmp');
end;