# byte Array aus ImageIcon



## pausch (11. Sep 2011)

Hallo Java-Gemeinde,
Ich schreibe derzeit ein Programm zum verwalten von DVDs. Um das Cover zu speichern verwende ich in meiner Klasse 
	
	
	
	





```
DVD
```
 den Datentyp des [japi]ImageIcon[/japi]s. Um das Cover in meine lokale Datenbank zu Schreiben (javaDB/Derby) brauche ich allerdings ein Byte Array des Covers (ist ein BLOB feld).
Jetzt meine Frage:
Wie bekomme ich aus dem ImageIcon ein ByteArray und wie bekomme ich beim abrufen aus der Datenbank wieder ein ImageIcon?
Wäre nett, wenn Ihr mir helfen könntet.

Danke schonmal...
pausch


----------



## Marco13 (11. Sep 2011)

Wie kommt denn das Bild ins ImageIcon? Wenn das überall ein BufferedImage ist, geht es recht leicht: Das BufferedImage kann man z.B. als PNG oder JPG in einen ByteArrayOutputStream schreiben (und aus einem ByteArrayInputStream lesen), mit ImageIO. Ansonsten müßte man das Image erst in ein BufferedImage reinmalen.


----------



## pausch (11. Sep 2011)

Das Bild kommt als [japi]URL[/japi] in das [japi]ImageIcon[/japi]. Das hilft allerdings kaum, weil ich von der Stelle des Programms auf das ich auf das [japi]ImageIcon[/japi] zugreife und in meinem Entity abspeichere, keinen Zugriff mehr auf die ursprüngliche [japi]URL[/japi] habe.


----------



## Marco13 (11. Sep 2011)

Hmja, auch von der URL werden die Daten irgendwie gelesen. Eigentlich sollte strukturell gesehen wohl in der (Modell-) Klasse "DVD" kein ImageIcon, sondern bestenfalls ein BufferedImage liegen, aber wenn dort ein ImageIcon liegen soll, wirst du das Image vom ImageIcon zum lesen und Schreiben un ein BufferedImage konvertieren müssen. Wie werden die Daten denn in das ImageIcon gelesen, NACHDEM sie einmal abgespeichert wurden?


----------



## pausch (11. Sep 2011)

Dann machen wir aus dem ImageIcon in der DVD doch ein BufferedImage, gar keine schlechte Idee  Danke.
Fragt sich nur, wie ich aus einer URL ein BufferedImage generieren lassen kann...


----------



## Marco13 (11. Sep 2011)

War ja nur ein Gedanke. Ein Bild ist eben die "Elementarste" Repräsentation eines Covers. Ein ImageIcon ist eine GUI-Component, die mit dem "Datenmodell" der DVD nicht viel zu tun hat. 
Wie auch immer: Aus einer URL kann man sich mit URL (Java Platform SE 6) einen InputStream holen, den man dann mit ImageIO (Java Platform SE 6) zu einem BufferedImage machen kann. 
Wo kommt die URL her? Ist das eine Datei?


----------



## pausch (11. Sep 2011)

The Internet Movie Database (IMDb) -> Da kommt meine URL her 
Das mit ImageIO ist eine gute Lösung denke ich... Da setze ich mich morgen mal dran. Heute Abend wird das bei mir nichts mehr 
Vielen Dank für die Aufklärung

Liebe Grüße
pausch


----------



## pausch (12. Sep 2011)

Marco13 hat gesagt.:


> War ja nur ein Gedanke. Ein Bild ist eben die "Elementarste" Repräsentation eines Covers. Ein ImageIcon ist eine GUI-Component, die mit dem "Datenmodell" der DVD nicht viel zu tun hat.
> Wie auch immer: Aus einer URL kann man sich mit URL (Java Platform SE 6) einen InputStream holen, den man dann mit ImageIO (Java Platform SE 6) zu einem BufferedImage machen kann.
> Wo kommt die URL her? Ist das eine Datei?



...Nachdem ich jetzt etwas gesucht und wenig gefunden habe, kommt jetzt meine (vielleicht etwas blöde) Frage:
Wie bekomme ich denn ein BufferedImage aus der URL? Und weiter gedacht: Um das BufferedImage in ein ByteArray zu konvertieren benötige ich auch das Format des Bildes, das ja bekanntlich auch variieren kann, wenn ich die URL wie oben beschrieben abrufe!

Danke nochmal...


----------



## pausch (12. Sep 2011)

Ok einen Schritt bin ich schon weiter:

```
BufferedImage bi = ImageIO.read(url.openStream());
```
Erst lesen dann probieren, dann antworten... Ich habe nicht gut gelesen, glaube ich... Naja aber nachwievor habe ich die Formatprobleme...

Hier meine aktuelle Lösung, aber ich frage mich, ob das überhaupt funktioniert...

```
private byte[] getByteArray(BufferedImage i) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try {
			ImageIO.write(i, "jpg", baos);
			return baos.toByteArray();
		} catch (IOException e) {
			try {
				ImageIO.write(i, "png", baos);
				return baos.toByteArray();
			} catch (IOException ex) {
				logger.error("Bild konnte nicht gespeichert werden!", e);
				RootController.setException(ex);
			}

			logger.error("Bild konnte nicht gespeichert werden!", e);
			RootController.setException(e);
		}
		return null;
	}
```


----------



## Marco13 (12. Sep 2011)

So ganz habe ich die Frage nicht verstanden: Das BufferedImage hat kein "Format", zumindest nicht im Sinne von JPG oder PNG. Das BufferedImage ist ein Array von Pixeln (und noch ein bißchen mehr). WAS soll genn genau in diesem byte-Array drin stehen? Im bisher geposteten Code würde der byte-Array immer das enthalten, was auch auf der Festplatte in einer Datei stehen würde, wenn man das Bild als JPG abspeichert. (Das könnte man dann z.B. auch in eine DB packen, und entsprechend aus diesen JPG-Daten dann auch wieder ein BufferedImage machen). Oder wolltest du wirklich die _pixel_ des Bildes speichern? Das wäre ziemliche Platzverschwendung. Zumindest PNG sollte es schon sein (das wäre im Gegensatz zu JPG auch verlustfrei)


----------



## pausch (12. Sep 2011)

Ich bin auch eher ein PNG-Freund.
Ich wusste nicht, genau wie ein BufferedImage arbeitet, jetzt habe ich das glaube ich durchblickt, ich speichere also mit der ImageIO.write methode das Bild in einem angegebenen Format und sage ImageIO.write nicht welches Format das Bild vorher hatte. Danke 

Schönen abend noch


----------

