如何将帧从TGifImage提取到位图中? [英] How to extract frames from a TGifImage into Bitmaps?

查看:43
本文介绍了如何将帧从TGifImage提取到位图中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的演示尝试在表格的画布上绘制GIF.它不起作用.图像不会前进.如何使其工作?

The demo below tries to draw the GIF on form's canvas. It doesn't work. The image won't advance. How to make it work?

procedure TForm1.FormCreate(Sender: TObject);
begin
 GIF := TGIFImage.Create;
 GIF.LoadFromFile('c:\2.gif');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 GIF.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
VAR i: Integer;
begin
 REPEAT
  for i:= 0 to GIF.Images.Count-1 DO
   begin
    DisplayGifFrame(i);
    Sleep(30);
   end;
 UNTIL FALSE;
end;


procedure TForm1.DisplayGifFrame(AIndex: Integer);
VAR
   Renderer: TGIFRenderer;
begin
 Renderer := TGIFRenderer.Create(GIF);
 TRY
  Renderer.Animate := TRUE;
  Renderer.FrameIndex := AIndex;
  Renderer.Draw(Canvas, Canvas.ClipRect); 

  {save frame in a bitmap here. save bitmap to disk}
  // xxx 
 FINALLY
  Renderer.Free;
 end;
end;

我要实现的目标:
我想从GIF中提取所有帧并将每个帧放在一个唯一的位图中.

What I want to achieve:
I want to extract all frames from a GIF and put each frame IN A UNIQUE bitmap.

更新:
在这里继续:无法在动态创建的TBitmap上绘制GIF

推荐答案

尝试一下:

procedure TForm1.Button1Click(Sender: TObject);
var
  GIF: TGIFImage;
  Bitmap: TBitmap;
  I: Integer;
  GR: TGIFRenderer;
  R: TRect;
begin
  GIF := TGIFImage.Create;      
  Bitmap := TBitmap.Create;
  try
    GIF.LoadFromFile('c:\test\test.gif');
    Bitmap.SetSize(GIF.Width, GIF.Height);
    GR := TGIFRenderer.Create(GIF);
    try
      for I := 0 to GIF.Images.Count - 1 do
      begin
        if GIF.Images[I].Empty then Break;
        GR.Draw(Bitmap.Canvas, Bitmap.Canvas.ClipRect);
        GR.NextFrame;
        Bitmap.SaveToFile(Format('%.2d.bmp', [I]));
      end;
    finally
      GR.Free;
    end;  
  finally
    GIF.Free;
    Bitmap.Free;
  end;
end;

以上代码考虑了Frame的 Disposal 方法.请参见此处.

The above code takes into account Frame's Disposal method. see related question here.

这篇关于如何将帧从TGifImage提取到位图中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆