Delphi的TGIFImage
发生了以下事件:OnPaint
,OnAfterPaint
,OnLoop
,OnEndPaint
。
但是在显示动画GIF时,这些事件都没有被调用过。
我使用以下代码显示动画GIF:
FGif := (Image1.Picture.Graphic as TGIFImage);
FGif.OnProgress := GifProgress;
FGif.OnLoop := GifLoop;
FGif.OnPaint := GifPaint;
FGif.OnEndPaint := GifEndPaint;
FGif.OnAfterPaint := GifAfterPaint;
FGif.Animate := True;
如何在播放动画时提取当前可见帧索引?
如何检测动画何时结束?
如何检测下一帧何时显示?
仅在第一个动画循环期间调用 OnProgress
事件,在绘制完最后一个动画帧之后 - TGIFImage将从第一帧继续动画,但此事件将停止工作。
我使用的是Delphi 10.2 Tokyo。
答案 0 :(得分:1)
您提到的大多数事件都没有(正如您所发现的那样)实施,尽管占位符在那里。大约十年前,当GifImg
单位进行重大修改时,似乎已经失踪了。
使用另一种方法,您可以解决您提到的问题。这是分别声明TGIFRenderer
,这使您可以访问所需的信息。
示例应用程序如下所示:
type
TForm22 = class(TForm)
Button1: TButton;
OpenDlg: TOpenDialog;
SaveDlg: TSaveDialog;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
r: TRect;
gif: TGifImage;
rend: TGIFRenderer;
procedure GifChange(Sender: TObject);
public
end;
implementation
procedure TForm22.Button1Click(Sender: TObject);
begin
if not OpenDlg.Execute() then Exit;
// the following is 12 by default to be as slow as Mozilla in last millenium
GIFDelayExp := 10; // set to 10 for correct timing
gif:= TGIFImage.Create;
gif.LoadFromFile(OpenDlg.FileName);
gif.OnChange := GifChange;
gif.Animate := True;
r := Rect(0, 0, Gif.Width, Gif.Height);
r.offset((Image1.Width-Gif.Width) div 2, (Image1.Height-Gif.Height) div 2);
rend := TGIFRenderer.Create(Gif);
rend.Animate := True;
rend.StartAnimation;
rend.Draw(Image1.Canvas, r);
end;
procedure TForm22.GifChange(Sender: TObject);
begin
rend.Draw(Image1.Canvas, r);
Label1.Caption := Format('Frame nr %d / %d',[rend.FrameIndex, gif.Images.Count]);
Label2.Caption := Format('Per frame: %d ms',[rend.FrameDelay]);
Label3.Caption := Format('Full cycle: %d s',[rend.FrameDelay * gif.Images.Count]);
end;
使用TGifRenderer.FrameIndex
,TGifImage.Images.Count
和TGifRenderer.FrameDelay
,您可以计算出问题的答案。