[杂谈] 在 Delphi/C++ Builder 中创建无限循环的 GIF 动画

首先是看代码:

var
  AGif: TGifImage;
  ABitmap: TBitmap;
  i: Integer;
  ALoopExt:TGIFAppExtNSLoop;
begin
  AGif := TGifImage.Create;
  AGif.SetSize(100, 100);
  ABitmap := TBitmap.Create;
  ABitmap.SetSize(100, 100);
  for i := 9 downto 0 do
  begin
    ABitmap.Canvas.FillRect(Rect(0, 0, 100, 100));
    ABitmap.Canvas.TextOut(i * 10, 30, IntToStr(i));
    if i = 9 then
      TGIFAppExtNSLoop.Create(AGif.Add(ABitmap))
    else
      AGif.Add(ABitmap);
  end;
  AGif.AnimationSpeed := 100;
  Image1.Picture.Assign(AGif);
  TGifImage(Image1.Picture.Graphic).Animate := true;
  FreeAndNil(ABitmap);
  FreeAndNil(AGif);
end;

这段代码实现的是绘制了一个从右到左的,从 9 变到 0 的小动画,动画每帧间隔为 100ms,我们用一个 TImage 的实例 Image1 来显示。

这里,有一个关键的地方,是为动画添加 TGIFAppExtNSLoop 扩展,如果不设置,动画将只播放一次就停了。添加扩展后,这个动画就可以无限循环下去或者循环指定的次数(通过设置 TGIFAppExtNSLoop 的 Loops 属性)。

这里有一个问题,就是 TGIFImage  每帧的间隔时间是固定的,我没看到在那儿能够设置非匀速的 GIF 动画。如果你知道,欢迎一起交流。

分享到: