// 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; 

Zugriffe seit 6.9.2001 auf Delphi-Ecke