Animiertes Gif

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Animiertes Gif

Beitrag von hbr »

Hallo,
Wie kann man unter LZ herausfinden ob es sich bei einem *.gif um ein einfaches oder Animiertem Gif File handelt?

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Animiertes Gif

Beitrag von Jorg3000 »

Hi!
In der Unit FPReadGif habe ich mir mal die Klasse TFPReaderGif angeschaut. Darin habe ich gesehen, dass die Lesefunktion nur einen Image-Descriptor interpretiert, d.h. die Klasse kümmert sich nicht um mehrere Bilder.

Aber im Web habe ich eine Komponente speziell für Animierte GIFs mit Lazarus gefunden: https://github.com/aducom/gifanim
Grüße, Jörg

Benutzeravatar
theo
Beiträge: 10919
Registriert: Mo 11. Sep 2006, 19:01

Re: Animiertes Gif

Beitrag von theo »

@hbr: Was ist "LZ"?
Meinst du "LZW" (Lempel-Ziv-Welch-Algorithmus)?

Was verwendest du denn für die AnimatedGIF?
TBGRAAnimatedGif oder die Optionen, die Jorg3000 genannt hat?
Die Frage wird sich wohl darüber klären lassen.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Animiertes Gif

Beitrag von hbr »

Danke für die Antworten,

es ging mir ja nicht darum, dass die Animierten GIF's angezeigt werden,
sondern nur darum, dass man ermitteln kann, welches GIF es ist.

Habe nun die BGRA Controls hinzugefügt und schreibe das Programm komplett neu,
weil ich mich selbst durch die Struktur nicht mehr zurechtgefunden habe.

Benutzeravatar
theo
Beiträge: 10919
Registriert: Mo 11. Sep 2006, 19:01

Re: Animiertes Gif

Beitrag von theo »

hbr hat geschrieben: Fr 26. Jul 2024, 12:58 es ging mir ja nicht darum, dass die Animierten GIF's angezeigt werden,
sondern nur darum, dass man ermitteln kann, welches GIF es ist.
Wenn es nur darum geht, könnte man es mit Bordmitteln z.B. so probieren (quick and dirty):

Code: Alles auswählen

uses FPImage, FPCanvas, FPReadGif;
...
function isAnimatedGif(FileName:String):Boolean;
var Image : TFPCustomImage;
    ReaderGIF : TFPReaderGif;
begin
  Image := TFPMemoryImage.Create (0,0);
  ReaderGIF := TFPReaderGif.Create;
  Image.LoadFromFile (FileName, ReaderGIF);
  Result:=ReaderGIF.GraphicsCtrlExt.DelayTime>0;
  ReaderGIF.Free;
  Image.Free;
end;        
Die Idee dabei ist, dass ein nicht-animiertes Bild keine DelayTime>0 hat.
Da kann man gerne drüber diskutieren.
Den Codefetzen müsste man natürlich noch absichern (try etc..).

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Animiertes Gif

Beitrag von hbr »

Ja da tauscht man eine übel mit der anderen ein.
Jetzt habe ich das Problem, wenn ich in das BGRASpriteAnimation1.AnimatedGifToSprite(opendialog1.FileName);
Eine andere Datei (bmp, jpg…usw.) lade und den Mime Type abfragen will, (weil ja eine Base64 umgewandelte Datei keine Bildtyperweiterung besitzt) auf dem Befehl (BGRASpriteAnimation1.Sprite. MimeType) ein Schloss ist, also nicht geht.
BGRASpriteAnimation1.Sprite. MimeType;
Eventuell hierzu Idee?

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Animiertes Gif

Beitrag von hbr »

theo hat geschrieben: Fr 26. Jul 2024, 13:38
hbr hat geschrieben: Fr 26. Jul 2024, 12:58 es ging mir ja nicht darum, dass die Animierten GIF's angezeigt werden,
sondern nur darum, dass man ermitteln kann, welches GIF es ist.
Wenn es nur darum geht, könnte man es mit Bordmitteln z.B. so probieren (quick and dirty):

Code: Alles auswählen

uses FPImage, FPCanvas, FPReadGif;
...
function isAnimatedGif(FileName:String):Boolean;
var Image : TFPCustomImage;
    ReaderGIF : TFPReaderGif;
begin
  Image := TFPMemoryImage.Create (0,0);
  ReaderGIF := TFPReaderGif.Create;
  Image.LoadFromFile (FileName, ReaderGIF);
  Result:=ReaderGIF.GraphicsCtrlExt.DelayTime>0;
  ReaderGIF.Free;
  Image.Free;
end;        
Die Idee dabei ist, dass ein nicht-animiertes Bild keine DelayTime>0 hat.
Da kann man gerne drüber diskutieren.
Den Codefetzen müsste man natürlich noch absichern (try etc..).
Da ich überhaupt mit TBGRA keinen Stream in BGRASpriteAnimation1.Sprite.LoadFromStream(Stream)
ohne Fehler laden kann ist das Packet für mich unbrauchbar, leider finde ich keinerlei Beispiele dafür.
Vielleicht liegt es daran das der Streamtype hier Cardinal ist.

Also habe ich Deine Funktion versucht, aber sie funktioniert auch nicht.
Habe aber dann auch folgende Änderungen gemacht da mein Typ Stream ist.

Code: Alles auswählen

function isAnimatedGif(StreamName:TMemoryStream):Boolean;
var Image : TFPCustomImage;
    ReaderGIF : TFPReaderGif;
begin
  Image := TFPMemoryImage.Create (0,0);
  ReaderGIF := TFPReaderGif.Create;
  Image.LoadFromStream(StreamName, ReaderGIF);
  //Image.LoadFromFile (FileName, ReaderGIF);
  Result:=ReaderGIF.GraphicsCtrlExt.DelayTime>0;
  ReaderGIF.Free;
  Image.Free;
end;    

Benutzeravatar
theo
Beiträge: 10919
Registriert: Mo 11. Sep 2006, 19:01

Re: Animiertes Gif

Beitrag von theo »

hbr hat geschrieben: Fr 26. Jul 2024, 16:53 Also habe ich Deine Funktion versucht, aber sie funktioniert auch nicht.
Warum funktioniert die nicht?
Ist halt für File statt Stream, aber sie funktioniert doch?

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: Animiertes Gif

Beitrag von hbr »

theo hat geschrieben: Fr 26. Jul 2024, 19:35
hbr hat geschrieben: Fr 26. Jul 2024, 16:53 Also habe ich Deine Funktion versucht, aber sie funktioniert auch nicht.
Warum funktioniert die nicht?
Ist halt für File statt Stream, aber sie funktioniert doch?
OK Sorry richtig, habe diese mit File versucht und sie Funktioniert.

Ich bekomme es nicht hin, sie auf Stream umzusetzen.
Was muss ich ändern ?

Dann verzweifele ich an der Komponente (BGRASpriteAnimation).
Das einzige was Funktioniert ist BGRASpriteAnimation.AnimatedGifToSprite(opendialog1.FileName);
alle andere Versuche mit BGRASpriteAnimation.Sprite.LoadFromStream(Stream,0);
BGRASpriteAnimation.Sprite.SaveToStream('Filename');
schlugen fehl, es wird einfach nichts geladen, übergeben bzw. angezeigt.

Bei LoadFromStream(sind die Parameter: AStream, ASize).
Was ist mit ASize gemeint? der Startwert? die StreamLänge?
bei allem anderen als 0, gibt es Fehler.
Was kommt da rein?
Bitte um Unterstützung.

Benutzeravatar
theo
Beiträge: 10919
Registriert: Mo 11. Sep 2006, 19:01

Re: Animiertes Gif

Beitrag von theo »

hbr hat geschrieben: Fr 26. Jul 2024, 20:07 Ich bekomme es nicht hin, sie auf Stream umzusetzen.
Was muss ich ändern ?
Bei mir geht deine Funktion mit dem Stream.
Vielleicht hilft es, die Position auf 0 zu setzen.

Code: Alles auswählen

function isAnimatedGif(AStream:TMemoryStream):Boolean;
var Image : TFPCustomImage;
    ReaderGIF : TFPReaderGif;
begin
  Image := TFPMemoryImage.Create (0,0);
  ReaderGIF := TFPReaderGif.Create;
  AStream.Position:=0; //<---
  Image.LoadFromStream(AStream, ReaderGIF);
  Result:=ReaderGIF.GraphicsCtrlExt.DelayTime>0;
  ReaderGIF.Free;
  Image.Free;
end;     
Von BGRA habe ich nicht viel Ahnung, damit kennen sich andere besser aus.

Antworten