Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Kleines GIF Problem (https://www.delphipraxis.net/134048-kleines-gif-problem.html)

bobo220673 14. Mai 2009 20:33


Kleines GIF Problem
 
Hallo!
Ich habe ein kleines GIF Problem, und hoffe Ihr könnt mir da weiterhelfen...

Ich versuche gerade GIF-Animationen Frameweise als Bitmap zu speichern ( was auch klappt ). Dazu verwende ich TGIFImage und packe die Frames einfach in ein TBitmap wo ich dann speicher ( bitmap.Assign(GIF.Images[x]); )

Das Problem was ich habe ist nur bei den Gifs wo sich Bereiche ändern. Die Bilder werden zwar gespeichert, passen aber in der Größe nicht zu den anderen Grafiken. Da ich die gespeicherten Bitmaps aber wieder zu einer Animation zusammen setze hat die neue Animation dann bei diesen Gifs Fehler. Gibt es für die Gifs wo sich nur die Bereiche ändern vieleicht ne andere Möglichkeit die einzelnen Bilder zu speichern ?

Luckie 14. Mai 2009 20:50

Re: Kleines GIF Problem
 
Das heißt, du hast GIFs wo sich bei denen nicht ganze Frames ändern, sondern wo sich nur Teile des Frames ändern oder wie kann ich das wo verstehen?

bobo220673 14. Mai 2009 21:08

Re: Kleines GIF Problem
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ja, es werden nur Bereiche pro Frame geändert und damit passt dann die neue Animation nicht mehr die ich später aus den Frames erstellen will.Ich hab mal so eine Gif + Ausgabe angehängt.

Luckie 14. Mai 2009 21:34

Re: Kleines GIF Problem
 
Die Lösung liegt doch eigentlich auf der Hand. Du nimmst ein Bitmap mit der Größe des GIFs. In ein zweites kopierts du den Frame aus dem GIF. Dann kopierst du das zweite Bitmap in das erste und speicherst das ab.

Eventuell kann man ein Bitmap auch nachträglich noch vergrößern oder es gibt noch ander Möglichkeiten, da ich nicht weiß, welche Möglichkeiten die von dir verwendeten Bibliotheken bieten.

bobo220673 14. Mai 2009 21:43

Re: Kleines GIF Problem
 
Habe ich versucht. Wenn ich das kopiere passen die Positionen nicht.

Luckie 14. Mai 2009 21:44

Re: Kleines GIF Problem
 
Hm, in dem PNG sieht es aber so aus, als wenn der Ursprung immer links oben wäre.

bobo220673 14. Mai 2009 21:51

Re: Kleines GIF Problem
 
Bei Bild 7 und 8 von unten siehste das mit den Positionen. Denke das muss anders gehen, nur wie weiss ich nicht...

Medium 14. Mai 2009 22:53

Re: Kleines GIF Problem
 
Es wäre evtl. nicht unwichtig zu wissen welches TGIFImage du benutzt. Bei Torry finde ich nämlich ein paar mit diesem Namen. Ich vermute mal ganz stark, dass irgendwo darin die Ursprünge der Frames auftauchen - sei es als array of TPoint, oder als Feld einer Klasse für ein Frame des GIFs oder wie auch immer, je nach Organisation in der Klasse. In der ursprünglichen Datei muss es ja zumindest stehen, sonst würde das ja kein Player der Welt schaffen ;) Dies dann in der Klasse auszulassen wäre schon sehr nachlässig.

bobo220673 14. Mai 2009 23:02

Re: Kleines GIF Problem
 
Also ich verwende "GIFImg" im Quelltext steht "This source code is adapted from the original TGIFImage written by Anders Melander.".
Ich habe aber auch verschiedene Gifengines versucht. Immer das gleiche Ergebnis. Es klappt, aber sobald so ein "komisches" Gif kommt is vorbei...

Medium 14. Mai 2009 23:28

Re: Kleines GIF Problem
 
Riecht nach dem 6. Eintrag der Torry Kategorie die ich verlinkt habe. Von dort aus findet sich auch der Link zur Seite des Projektes. Von dort habe ich mal die aktuellste Version heruntergeladen (für D7-D2009), in der sich auch eine Hilfe befindet. Dieser ist wiederum zu entnehmen, dass einzelne Frames in einer Liste der Klasse TGIFSubImage gekapselt sind, weeeelche wiederum die Property BoundsRect besitzt:
Zitat:

Zitat von TGIFImage Hilfe
BoundsRect
Specifies the bounding rectangle of the frame, relative to the GIF image.

Edit: Alternativ bieten sich an selber Stelle sogar noch die Properties "Left" und "Top" an, was ja sogar schon doppelt gemoppelt ist.
Edit2: Heh, Left und Top greifen sogar auf genau das selbe private Feld der Klasse zu. Also kannst du wirklich problemlos das benutzen was dir optisch im Code besser gefällt =)

So, oder so ähnlich hätte eine Recherche ausfallen können ;)

bobo220673 14. Mai 2009 23:54

Re: Kleines GIF Problem
 
Super:)

Wie kopiere ich denn dann den Bereich an die richtige Stelle im Bitmap? Hast du vieleicht ein Beispiel wie ich ein Gif umsetze ?

Medium 14. Mai 2009 23:59

Re: Kleines GIF Problem
 
Da TGIFSubImage das Frame sogar ganz komfortabel als TBitmap bereit stellt, kannst du es wie jedes andere einfach mittels TBitmap.Draw() in dein Zielbitmap zeichnen. Alternativ ginge auch BitBlt().

Edit: Die Klasse bietet sogar eine eigene Draw() Methode, so dass du nichtmal auf die Bitmap-Property zurückgreifen musst. Das Help-File ist echt spannend zu lesen :)

bobo220673 15. Mai 2009 01:56

Re: Kleines GIF Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also fast gut, aber irgendwas passt da immer noch nicht...

for x := 0 to Anzahl - 1 do
begin
sub:=GIF.Images[x];
bitmap.Canvas.Draw(sub.Left, sub.top,sub.Bitmap);
....

Medium 15. Mai 2009 10:38

Re: Kleines GIF Problem
 
In der Tat etwas kurios. Man könnte meinen, dass alle Sub-Frames die Änderung zum Frame 0 angeben, dem wiedersprechen aber die 2 Frames die nur die Augen beinhalten - diese würden mitten in der "Luft" landen, da der Smiley im Frame 0 an der Wand ist. Die selben Frames lassen die Vermutung, dass man alles rechts der Sub-Frames manuell schwarz zeichnen müsste auch nicht gelten (und es wäre eine recht blöde Sache, die wohl kaum einer in einen Standard nehmen würde :stupid:).
Schau mal nach ob TGIFSubImage nicht eine Property hat, die angeben könnte auf welches Frame es sich bezieht. Es muss scheinbar nicht zwangsweise immer das direkt vorhergehende sein, da die Klasse selbst schon eine Methode bietet Differenzframes zu frei gewählten anderen Frames zu erzeugen wie ich gestern beim Überfliegen gesehen habe.
Dann müsstest du jedes Frame rekursiv über seine Referenzframes zusammenstückeln (geht auch iterativ, aber wäre wohl ein typischer Fall für Rekursion).

bobo220673 15. Mai 2009 14:58

Re: Kleines GIF Problem
 
Also ich habe jetzt alles durch und nix will klappen :(

bobo220673 17. Mai 2009 22:42

Re: Kleines GIF Problem
 
Hat denn keiner bis jetzt so ein Problem gehabt, oder einen weg zu Lösung ? Ich fummel da jetzt schon Tagelang dran, aber egal was ich mache, immer das gleiche Problem :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz