Archiv verlassen und diese Seite im Standarddesign anzeigen : java: animierte gifs resizen
clm[k1]
2004-12-09, 18:22:59
Nachdem ich nun eine wunderschöne klasse habe, die normale gifs und jpegs resizen kann, kommt nun das nächste problem: wie stelle ich es an animierte gifs zu skalieren?
javainsel schweigt sich über animierte gifs leider aus.
und für google bin ich wohl zu blöd: da bekomme ich immer nur suchergebnisse der form "..hier kostenlos 1000 animierte gifs..." oder wie man mit java animierte gifs darstellt - nur weder nutzt mir das was, noch interessiert mich das.
Meine überlegung zu dem thema war bislang: eine neue klasse schreiben die die einzellbilder des animierten gifs rausfischt und mit hilfe meiner schon vorhandenen klasse jedes einzellbild resized und dann wieder zusammensetzt.
Nur ergeben sich daraus 2 schwierigkeiten:
1.) die einzellnen bilder animierter gifs sind im normalfall nicht gleich groß (könnte man umgehen, indem man ausrechnet um wieviel prozent skaliert werden muss - ausgehend vom ersten frame)
nur hat man dann:
2.) das problem, beim zurückschreiben die kleineren teilbilder wieder an die richtige stelle zu bekommen!
und außerdem brauch ich erst mal einen link oder überhaupt ne beschreibung oder nen hinweis wie ich die einzellbilder extrahieren kann - und was noch wichtiger ist: wie ich die wieder zusammen kleistern kann.
Zum schreiben der gifs nutze ich lang die GIFEncoder klasse von Adam Doppelt (die auch bei javainsel erwähnt wird).
Nur bezweifle ich das diese hinreichend ist um animierte gifs zu schreiben!
na dann postet mal eure meinung zu dem thema
clm[k1]
clm[k1]
2004-12-13, 12:03:45
Irgendwie scheint meine frage wohl nicht gerade trivial zu sein.
Wie dem auch sei: ich hab raus gefunden, das es für ImageMagick (http://www.imagemagick.org/) ein Java Interface namens JMagick (http://www.yeo.id.au/jmagick/) gibt, welches ganz brauchbar zu sein scheint.
Hab es noch nicht ausprobiert, sondern mir nur mal die API-Doku durchgeguckt, aber sieht schon mal ganz gut aus.
Wenn ich mich damit näher befasst habe, bzw. eine Lösung gefunden habe, schreib ich das hier rein.
...kann ja schließlich sein, das jemand das selbe problem hat.
so far
clm[k1]
clm[k1]
2004-12-20, 10:31:30
Also, ich habs ja nun inzwischen geschaft ein animiertes gif mit hilfe des java-inferface für ImageMagick zu scalieren.
Allerdings hab ich dabei noch probleme mit der transparenz.
Aus irgendeinem unerfindlichen grund bekomme ich es nicht gebacken, das der die vorhandene transparenz auch transparent lässt... (der macht das irgendwie schwarz)
Das problem kann man zwar "umgehen" indem man die bilder gewissermaßen zusammenfügt und dann halt die einzellnen frames als vollbilder hat, nur steigt dadurch die dateigröße in hohem maße an - was schlecht ist, da handys nicht gerade mit hoher bandbreite gesegnet sind, als dass man einfach so 100te KB große gifs senden könnte.
Ein weiteres problem ist das einfügen von text in bilder - auch da bekomme ich keine transparenz hin, der will zwingend eine hintergrundfarbe für den text.
Falls irgendjemand eine idee diesbezüglich hat: immer raus damit.
gruß
clm[k1]
clm[k1]
2004-12-20, 11:08:59
SCHMEERRRZZZZ....
oh Pein und Agonie..
Hab eben das problem mit der transparenz für text in einem bild gelöst.
Auf die idee die farbe "transparent" als hintergrundfarbe zu nehmen muss man erst mal kommen :ulol3: :crazy:
so far
clm[k1]
clm[k1]
2004-12-20, 12:27:04
OK, das problem mit der transparenz beim resizen scheint damit zusammen zu hängen, mit welcher methode man resized. Es gibt 2 methoden bei denen beim resizen interpoliert wird - dadurch geht an einigen stellen allerdings die transparenz verloren, was sich in den erwähnten schwarzen pixeln äußert.
Es gibt aber auch eine methode bei der nicht interpoliert wird - damit bleibt die transparent erhalten, allerdings wirkt das bild beim vergrößern dann äußerst pixelig.
Hat aber den vorteil, das dadurch die dateigröße optimiert wird. (wen es interessiert die methode ohne interpolieren ist "sampleImage(x, y)" )
...jetzt muss ich nur noch testen inwieweit das mit animierten gifs klappt wo die folge-frames kleiner sind - könnte probleme mit der positionierung geben, aber mal sehen.
gruß
clm[k1]
clm[k1]
2005-01-17, 11:44:55
So, nachdem ich jetzt den großteil der probleme in den Griff bekommen habe, will ich euch diese information natürlich nicht vorenthalten.
Zuerst einmal ein paar worte zur Offset-problematik.
Wie ja den meisten bekannt sein dürfte, können die frames eines animierten gifs unterschiedlich groß sein. Die Position im fertigen gif wird dann über offset angaben festgelegt.
Das Problem ist, das JMagick keine möglichkeit bietet, diese offset-angaben auszulesen.
(jedenfalls hab ich auch nach intensiver recherche und nachfragen in der mailingliste keine solche möglichkeit finden können)
Bevor ich zur lösung des problems komme, noch ein hinweis: solange man die frames nur mit sampleImage in der größe verändert, oder dergleichen und keine methoden wie zB compositeImage nutzt, spielt das keine rolle, weil ImageMagick sich den offset sozusagen merkt (und beim resizen auch mit anpasst) und die position im fertigen gif immernoch stimmt.
Wenn man jedoch compositeImage nutzen möchte, kommt man nicht daran vorbei, den offset zu kennen.
Also müssen wir diesen manuell auslesen. Da das gif-format kein geheimniss ist, fällt das nicht schwer. Der offset ist in der intel-notation hinter dem ersten auftreten von 2C (hexadezimal, oder 44 dezimal). Hinter erwähntem zeichen folgen 2 byte für den x-offset und 2 byte für den y-offset.
Jetzt braucht man also nur noch den frame in ein byte-array einzulesen (mit image2blob) und nach dem ersten vorkommen dieses zeichens den x- und y-offset auslesen. ..zu beachten sei hier, das - wenn man sich größeren aufwand ersparen will - man besagte prozedur wirklich nur mit den einzellnen frames durchführer sollte. Denn die Daten welche letztendlich das Bild beschreiben, können ja ebenfalls besagtes zeichen enthalten, weswegen es wenig nützen würde, nur nach dem vorkommen dieses zeichens zu suchen.
Das umgehen wir halt, indem wir das mit jedem frame extra machen, da wir hier einfach das erste vorkommen dieses zeichens nehmen können, weil wir sicher gehen können das es davor nicht auftritt.
Jetzt noch ein paar worte zur dateigröße.
Die betonung liegt auf "Größe", denn standartmäßig nutzt ImageMagick keine LZW-komprimierung (wegen dem mitlerweile ausgelaufenen Patent von unisys - da sieht man mal wieder das software-patente nix als ärger bringen. hoffen wir also das das in der EU nicht kommen wird)
Wie dem auch sei. LZW-komprimierung ist natürlich auch mit ImageMagick möglich, allerdings muss man es dazu neu kompilieren, und configure die option "--enable-lzw" mit übergeben.
Das führt im endeffekt zu um bis zu 3/4 kleineren dateigrößen.
Zum schluss noch ein problem was ebenfalls auftreten kann.
Nicht nur das animierte gifs unterschiedlich große frames haben kann, es ist auch möglich anzugeben wie diese frames angezeigt werden: hintereinander, übereinander, oder immer nur ein frame (und wahrscheinlich auch noch andere möglichkeiten).
Dies wird mit der methode getDispose/setDispose gemanaged.
ach ja: wer compositeImage benutzen will, sollte sich auch mal das Interface CompositeOperator angucken - nicht das man sich wundert wozu der integer-parameter compOp gut ist.
gruß
clm[k1]
HellHorse
2005-09-09, 11:37:17
*threadausgrab*
Auch wenn's clm[k1] jetzt nicht mehr hilft, vielleich irgend jemand anderem.
Animierte und komprimierte GIFs müssten eigentlich auch mit ImageIO gehen, wenn man 1.6 hat:
http://download.java.net/jdk6/docs/api/javax/imageio/package-summary.html#gif_plugin_notes
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.