# ImageIO gif Dateien laden



## BlubBlub (28. Okt 2010)

hi ich wollte eine gif laden und anschließend an einem neuen ort speichern.
die gif datei ist animiert. wenn ich den unteren code verwende dann funktioniert das laden
des bildes in meinen editor. die animation funtkioniert.


```
class ViewComponent extends JComponent
{
	private Image image;
 
	public void setImage( File file )
	{
		image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
	
		if ( image != null )
			repaint();
	}
  
	@Override
	protected void paintComponent( Graphics g )
	{
		if ( image != null )
			g.drawImage( image, 0, 0, this );
	}
}
```


wenn ich aber folgenden code verwende wird die gif datei zwar auch in meinem editor angezeigt, 
aber die animation funktioniert nicht. es wird nur ein bild davon angezeigt.


```
class ViewComponent extends JComponent
{
	private Image image;
 
	public void setImage( File file )
	{
		
		 try {
	           	image  = ImageIO.read( file );
	            
	 
	        } catch( IOException ex){
	            ex.printStackTrace();
	        }  
	
		if ( image != null )
			repaint();
	}
  
	@Override
	protected void paintComponent( Graphics g )
	{
		if ( image != null )
			g.drawImage( image, 0, 0, this );
	}
}
```

ich muss es aber mit dem zweiten code hinkriegen, da der zweite code ein BufferedImage objekt zurückliefert, welches das Interface RenderedImage implementiert.
dies ist wichtig da ich das RenderedImage Objekt für die ImageIO.write methode brauche.
da ich später folgendes machen will:


```
try {
            BufferedImage image  = ImageIO.read( file );
            ImageIO.write( image, "gif", file2);
 
        } catch( IOException ex){
            ex.printStackTrace();
        }
```

die ImageIO.write Methode fordert als erstes Argument ein Rendered Objekt.
Das gif das in einer neuen Datei gespeichert wird, sollte dann natürlich auch beim öffnen,
wieder funktionieren, also animiert und nicht nur ein Bild der Animation anzeigen.


----------



## AlexSpritze (28. Okt 2010)

```
Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
```

liefert dir erstmal ein Image zurück, aber vielleicht lässt es sich ja in ein BufferedImage oder RenderedImage konvertieren? 

Wieso _musst_ du den zweiten Ansatz nehmen?


----------



## BlubBlub (28. Okt 2010)

müssen weil  ImageIO.write( RenderedImage, "Dateiyp", file2)
ein RenderedImage benötigt.

Und mit 

```
image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
```
erhalte ich kein RenderedImage.
Also muss ich das Bild mit 


```
image  = ImageIO.read( file );
```
laden


----------



## AlexSpritze (28. Okt 2010)

Hier steht etwas zur Konvertierung von Image zu RenderedImage.

Angeblich einfach casten:

```
BufferedImage image = ImageIO.read(file.toURL());
```

Oder schauen von welchen Klassen das Objekt image überhaupt ist:


```
Image image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
 for(Class<?> c : image.getClass().getClasses(){
   System.out.println(c.getSimpleName());
 }
 for(Class<?> c : image.getClass().getDeclaredClasses(){
   System.out.println(c.getSimpleName());
 }
```

Vielleicht ist da schon was dabei?


----------



## BlubBlub (28. Okt 2010)

nee das funktioniert nicht. 

```
BufferedImage image = ImageIO.read(file.toURL());
```
das lässt der compiler nicht zu.

das andere funktioniert auch nicht.


----------



## BlubBlub (28. Okt 2010)

ich hab mal ein wenig weiter im internet recherchiert und dabei folgendes gefunden.
also das abspeichern von gif bildern, zumindest von animierten gif bildern wird nicht funktionieren.




> Da es rechtliche Probleme mit dem GIF-Format beim Schreiben gibt, wollte Sun keine Lizenzen zahlen und hat sich gegen Schreibmethoden entschieden
> 
> Java ist auch eine Insel – 14.9 Bilder anzeigen und Grafiken verwalten





> 14.9.16 Bilder im GIF-Format speichern  downtop
> 
> Java bietet uns als nette Hilfe das Laden von GIF- und JPG-kodierten Grafiken an. Leider blieben Routinen zum Speichern in dem einen oder anderen Dateityp auf der Strecke – und auch erst seit Java 1.2 hilft uns die Klasse JPEGImageEncoder beim Sichern von JPGs. Doch ist das Laden von GIF-Dateien überhaupt gestattet? Da UNISYS das Patent auf den Kompressionsalgorithmus Welch-LZW für GIF-Dateien hält, ist es eine rechtliche Frage, ob wir UNISYS Geld für das Laden von GIF-Dateien zum Beispiel aus Applets bezahlen müssen. Auf die an UNISYS gestellte Frage »If I make an applet (for profit) which loads a GIF image using the Java API function, will I need a license from you?« antwortet Cheryl D. Tarter von UNISYS: »Yes, you need a license from Unisys«. Das bedeutet im Klartext, dass eigentlich alle bezahlen müssten. Eine weitere Anfrage an die für Lizenzen zuständige Stelle bestätigte dies. Mit einer Klage seitens UNISYS ist jedoch nicht zu rechnen, und beim Lesen von GIF-Dateien ist somit keine Gefahr zu erwarten. Wer jedoch Bibliotheken zum Schreiben von LZW-komprimierten GIF-Dateien anbietet, sollte vorsichtig sein. Der Patentinhaber ist im Jahr 2000 dazu übergegangen, von Betreibern von Web-Seiten pauschal 5 000 Dollar Lizenzgebühren einzufordern, wenn sie nicht nachweisen können, dass die verwendeten GIF-Grafiken mit lizensierter Software erstellt wurden. Eine nette Web-Seite zu dem Thema findet sich unter Unisys Patents Expired, But Patent Threats Continue.
> 
> Java ist auch eine Insel – 14.9 Bilder anzeigen und Grafiken verwalten


----------



## slawaweis (29. Okt 2010)

BlubBlub hat gesagt.:


> hi ich wollte eine gif laden und anschließend an einem neuen ort speichern.
> die gif datei ist animiert. wenn ich den unteren code verwende dann funktioniert das laden
> des bildes in meinen editor. die animation funtkioniert.


ich weis jetzt nicht genau was Du mit Animation meinst. Nach meiner Erfahrung lädt Toolkit nur das erste Bild eines animierten GIFs.

RenderedImage ist ein Interface. ImageIO erwartet also ein Objekt, welches RenderedImage implementiert hat. BufferedImage implementiert dieses, also kannst Du es an ImageIO.write übergeben.



BlubBlub hat gesagt.:


> nee das funktioniert nicht.
> 
> ```
> BufferedImage image = ImageIO.read(file.toURL());
> ...



doch, es sollte so gehen, read() liefert ein BufferedImage zurück. Vielleicht versuchst Du es nur mit "file".

Deine Zitate zum GIF Format sind veraltet. Das Patent ist vor ein paar Jahren ausgelaufen und Java 6 kann GIF lesen und schreiben, auch animierte Dateien. Doch mit ImageIO ist das nicht ganz trivial. ImageIO ist ein Framework zu Bildbearbeitung, Toolkit einfach nur ein Hilfskasten. Um ein animiertes Bild mit ImageIO einzulesen, muss man den speziellen ImageReader holen und jedes Bild einzeln einlesen. Beim Speichern muss man eine ziemlich komplizierte Prozedur durchführen. Hier steht wie, ist aber ziemlich heavy:

Java 2D - Create animated GIF using imageio

Falls Du nicht vorhast das animierte Bild zu verändern, kannst Du es einfach Byte für Byte kopieren und brauchst es nicht zu decodieren bzw. wieder codieren.

Slawa


----------



## BlubBlub (30. Okt 2010)

> ich weis jetzt nicht genau was Du mit Animation meinst. Nach meiner Erfahrung lädt Toolkit nur das erste Bild eines animierten GIFs.



mit animation meine ich, dass das gif bild nicht nur aus einem einzigen bild besteht, sondern aus mehreren, die im zyklus wechseln. 
das toolkit lädt nicht nur das erste bild eines animierten GIFs. hab es schon ausprobiert, damit 
lässt sich mühelos die gesamte animation anzeigen.



> RenderedImage ist ein Interface. ImageIO erwartet also ein Objekt, welches RenderedImage implementiert hat. BufferedImage implementiert dieses, also kannst Du es an ImageIO.write übergeben.



dessen bin ich mir schon bewußt, aber das problem hierbei liegt, dass ich damit nur das erste bild eines gifs erhalte.
und wenn du sagst dass es ziemlich kompliziert ist alle bilder des gifs damit darzustellen, ist mir der aufwand zu hoch, da ich mit Toolkit mühelos gifs laden und anschließend korrekt wiedergeben kann.
ledigilich das speichern mit Toolkit funktioniert nicht.


----------

