Извлечь кадр из GIF с помощью GifImage - PullRequest
0 голосов
/ 28 апреля 2020

Как извлечь кадры из gif с помощью GifImage 2.X, в котором нет TGifRenderer?

Вот как я пытаюсь, но кадры неполные (наполовину пустые):

  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

    Bmp.Assign(Gif.Images.SubImages[i].Bitmap);

    Bmp.SaveToFile('out/' + IntToStr(i) + '.bmp');

  end;

1 Ответ

0 голосов
/ 29 апреля 2020

Это решение для версии 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;
...