2017-11-05 3 views
1

델파이 TGIFImage의 이벤트는 다음과 같습니다. OnPaint, OnAfterPaint, OnLoop, OnEndPaint. 그러나 애니메이션 GIF를 표시하는 동안이 이벤트 중 아무 것도 호출되지 않습니다. 애니메이션이 재생 될 때애니메이션 GIF가있는 TGIFImage - 이벤트가 작동하지 않습니다. - 애니메이션 진행 상태를 감지하는 방법은 무엇입니까?

FGif := (Image1.Picture.Graphic as TGIFImage); 
    FGif.OnProgress := GifProgress; 
    FGif.OnLoop := GifLoop; 
    FGif.OnPaint := GifPaint; 
    FGif.OnEndPaint := GifEndPaint; 
    FGif.OnAfterPaint := GifAfterPaint; 
    FGif.Animate := True; 

어떻게 현재 보이는 프레임 인덱스를 추출 :

나는 애니메이션 GIF를 표시하려면 다음 코드를 사용?

애니메이션이 완료되면 어떻게 감지합니까?

다음 프레임이 표시 될 때를 감지하는 방법은 무엇입니까?

OnProgress 이벤트는 마지막 애니메이션 프레임이 그려진 후 첫 번째 애니메이션 루프에서만 호출됩니다. TGIFImage는 첫 번째 프레임에서 애니메이션을 계속하지만이 이벤트는 작동을 멈 춥니 다.

저는 Delphi 10.2 Tokyo를 사용하고 있습니다.

+0

소스에 액세스 할 수있는 경우 일부 디버깅을 수행하여 이벤트가 호출되지 않는 이유를 확인할 수 있습니다 –

답변

1

이벤트의 대부분은 자리 표시자가 있지만 구현 된 것이 아닙니다 (발견 한대로). 10 년 전만해도 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 당신이 당신의 질문에 대한 답변을 계산할 수 있습니다.