// Die Delays
der einzelnen Frames eines animierten Gifs auslesen.
// Getestet mit RS 10.4 unter Win11
var
Delays: Array of Integer;
function DurationOnce(Datei: TFilename): Integer;
var
I, D, GDE, GDD: Integer;
Rend: TGIFRenderer;
Gif: TGifImage;
begin
Result := 0;
GDE := Vcl.Imaging.GIFImg.GIFDelayExp;
GDD := Vcl.Imaging.GIFImg.GIFDefaultDelay;
Gif := TGifImage.Create;
Gif.LoadFromFile(Datei);
Rend := TGIFRenderer.Create(Gif);
Rend.FrameIndex := -1;
Rend.NextFrame;
for I := 0 to Pred(Gif.Images.Count) do
if not Gif.Images[I].Empty then
begin
SetLength(Delays, succ(I));
D := GDD * (Rend.FrameDelay div GDE);
Inc(Result, D);
Delays[I] := D;
Rend.NextFrame;
end;
FreeAndNil(Rend);
FreeAndNil(Gif);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Delays := nil;
end;
// Auswertung
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
I, D: Integer;
begin
if OpenDialog1.Execute then
begin
D := DurationOnce(OpenDialog1.FileName);
S := 'Ein Durchlauf: ' + IntToStr(D) + ' ms'#13;
S := S + 'Frame-Anzahl: ' + IntToStr(Length(Delays)) + #13#10#10;
for I := Low(Delays) to High(Delays) do
S := S + 'Frame ' + IntToStr(I) + ': ' + IntToStr(Delays[I]) +
' ms' + #13;
ShowMessage(S);
end;
end;
|