Hallo Java-Gemeinde,
Ich schreibe derzeit ein Programm zum verwalten von DVDs. Um das Cover zu speichern verwende ich in meiner Klasse
Code:
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.
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.
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.
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?
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...
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?
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
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!
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)
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