Animiertes GIF verhält sich seltsam in Swing

Wölfchen

Grünschnabel
Hallo,

ich habe mehrere animierte GIFs, die ich einerseits als ImageIcon in einem JLabel und andererseits (teilweise) noch zusätzlich via drawImage auf einem JPanel gezeichnet darstelle.

Das funktioniert soweit auch super, die Animationen laufen problemlos und richtig.

Nun habe ich ein zusätzliches GIF eingebaut und das verhält sich irgendwie... seltsam. Es flackert, das Bild ist teilweise abgeschnitten etc...

Öffne ich es mit einem GIF-Editor kann ich keinen Unterschied zu einem "normalen" animierten GIF feststellen. Lasse ich mir aber von Java die einzelnen Frames z.B. in ein PDF ausgeben, wird mir auch klar, warum sich das GIF so seltsam verhält.

Im PDF habe ich am Ende nämlich nicht lauter nette Frames, die sich eben in ein paar Pixeln unterscheiden, sondern anscheinend ganz am Anfang mal das Grundbild und in den folgenden Frames nur die Änderungen - ohne Grundbild. Legt man Grundbild + Änderung übereinander, hat man den "richtigen" Frame.
Wenn ich das GIF aber z.B. im Browser öffne, verhält es sich normal.

Leider kenne ich mich mit animierten GIFs jetzt auch nicht so gut aus, dass ich sofort sagen könnte, woran das liegt. Das Problem, das noch dazukommt, ist, dass ich auf das GIF eigentlich keinen Einfluss habe. Das liegt auf einem Server und ich lade es nur.

Ich könnte mir z.B. vorstellen, dass es in einer GIF-Datei ein Flag gibt, welches dem Programm sagt "lösch nicht immer das ganze Bild sondern zeichne den ersten Frame und leg dann der Reihe nach die anderen darüber" und das in Java einfach nicht so funktioniert.

Weiß hier jemand Rat? Das PDF mit den Frames wie Java sie sieht habe ich mal angehängt. Im richtigen GIF sollte das eigentlich einfach mehr oder weniger ein Lauflicht von rechts nach links darstellen.
 

Anhänge

  • ani.pdf
    53,2 KB · Aufrufe: 31
Hallo,

nach der GIF-Spezifikation (http://www.w3.org/Graphics/GIF/spec-gif87.txt) heißt es:
Each image explicitly overwrites any image already on the screen

inside of its window. The only screen clears are at the beginning

and end of the GIF image process.

Ich habe mit GIFs in Verbindung mit Java noch nicht gearbeitet, aber es kann eigendlich nur zwei Möglichkeiten geben. Entweder hat die Java-Implementierung von animierten GIFs einen kleinen Fehler, oder das GIF hat einen Fehler. Ohne die orginal GIF-Datei läßt sich das etwas schwer sagen.

Der einfachste Weg wäre, die GIF-Datei so zu bearbeiten, daß diese anschließend von Java ohne Probleme gefressen wird.
Der komplizierte Weg wäre, das GIF zu laden, die einzelnen Bilder zu extrahieren und daraus selber eine Animation zu programmieren. Dabei hätte man die totale Kontrolle über die Zeichenoperationen.

MfG
hansmueller
 
Danke für den Auszug aus der Spezifikation, d.h. also, es wäre ganz normal, wenn ein GIF-Frame nur Teile des Bildes enthält - nämlich die, die geändert werden.

Hier ist das animierte GIF:
20fycxu.jpg


Aber wie gesagt, ich habe auf das GIF leider keinen Einfluss, da es auf einem Server liegt und nicht von mir stammt. Ich verwende es nur.

Die einzige Möglichkeit, die ich hätte, wenn Java das wirklich nicht richtig darstellen kann, ist, das ganze GIF händisch neu zu erstellen und irgendwie einzubauen, dass er manche GIFs eben lokal lädt... Was aber natürlich den Wartungsaufwand nicht unerheblich erhöht, da ich Änderungen dann auch immer händisch nachziehen muss. Möchte ich eigentlich gerne vermeiden :(
 
Habe die Fehlerquelle mittlerweile herausgefunden.

Es gibt bei GIF-Frames zwei Einstellungsmöglichkeiten zum Frameübergang (zumindest in dem Grafikprogramm mit dem ich mir die GIFs angesehen habe ;)). Alten Frame löschen oder darüberzeichnen.

Wenn die gesamte Datei nur einen der beiden Übergänge aufweist - also immer löschen oder immer überzeichnen - funktioniert die Darstellung in Java einwandfrei. Sobald es zu einem Wechsel der Übergange kommt verhält sich das GIF im Bereich dieser Frames seltsam.
So hatte ich ein GIF, das hat den größten Teil über die Einstellung "Löschen". Dieser Teil wurde problemlos dargestellt. Nur im Bereich der zwei Frames, die auf "Überzeichnen" gestellt waren, kam es zu einem Flackern.

Sieht also leider nach einem Bug in Java aus, der sich nicht so einfach umgehen lässt und ich werde die GIFs eben doch lokal laden (und die Übergange entsprechend anpassen) müssen. Hält sich hoffentlich im Rahmen.

Danke trotzdem für eure Hilfe :)
 

Neue Beiträge

Zurück