# Bilder mit nem ObjectStream übertragen



## RawBit (1. Nov 2012)

Hmm, also folgendes

Image implementiert ja blöderweise Serializable nicht - macht nix, ich muss sowieso mit BufferedImage arbeiten, weil das Bild zuerst auf eine gewisse Größe zurechtgestutzt werden muss.

Wie übertrage ich das BufferedImage nun über den ObjectInput/OutputStream - das implementiert ja Serializable leider auch nicht - ich hab nach ein bisschen Googlerecherche gelesen, daß man das BufferedImage ja in ein byteArray umwandeln kann, das dann übertragen wird und auf der anderen Seite wieder zu dem BufferedImage zusammengesetzt.

Gibt vllt irgendeine schönere Lösung ? Sollte ich vllt mit dem Input/Output Stream von Socket und ServerSocket nen eigenen Stream für Bilder erzeugen ?

Danke für Tipps wies besser geht

Anm:
Für das Byte Array würde natürlich ein ByteArrayI/OStream verwendet werden..


----------



## FArt (1. Nov 2012)

ImageIO (Java 2 Platform SE v1.4.2)


----------



## RawBit (1. Nov 2012)

Das war jetzt nicht besonders hilfreich ... ImageIO is mir schon klar, ich wollte nur wissen, welche Lösung die eleganteste, performanteste, sicherste, schnellste, einfach die beste für so ein Problem ist.


----------



## SlaterB (1. Nov 2012)

vielleicht sollte es dieser Link sein
ImageIcon (Java Platform SE 6)
> public class ImageIcon extends Object implements Icon, *Serializable*, Accessible

dennoch ruhig bisschen im Ton aufpassen, die Signatur dazu ist ja auch ..


----------



## MR_UNIX (1. Nov 2012)

Ein Bild besteht aus Bytes! Schlussfolgerung: Sehr guter Ansatz, ein Byte-Array daraus zu machen und es zu übertragen.
Alternativ kannst du auch eine eigene Klasse für Bilder machen, was aber wahrscheinlich nicht der einfachste Weg ist.


----------



## Marco13 (1. Nov 2012)

Meine Kristallkugel sagt mir, dass der Thread http://www.java-forum.org/awt-swing-swt/99632-bildqualitaet-verringern.html interessant sein könnte. Ein Image zu Serializen kann langsam sein, weil die Datenmenge u.U. riesig ist. ImageIO war darum schon nicht verkehrt: Damit kann man das Image als JPG/PNG in den Stream schicken, und auf der anderen Seite wieder auspacken. WAS tatsächlich in welchem Anwendungsfall schneller ist, hängt von verschiedenen Faktoren ab, die aber in dem verlinkten Thread recht ausführlich diskutiert wurden.


----------



## FArt (1. Nov 2012)

BigH hat gesagt.:


> Das war jetzt nicht besonders hilfreich ...


Finde ich nicht.



BigH hat gesagt.:


> ImageIO is mir schon klar


War mir nicht klar, denn das hast du vergessen zu erwähnen. Ausserdem hättest du dann gesehen, dass du keinen eigenen Stream erzeugen musst, denn ImageIO arbeitet auch direkt mit Streams.



BigH hat gesagt.:


> welche Lösung die eleganteste, performanteste, sicherste, schnellste, einfach die beste für so ein Problem ist.


Nicht erst ein Array erzeugen, sondern gleich in den Stream pipen.


----------



## Ullenboom (2. Nov 2012)

ImageIcon ist zwar Serializable, aber dann wird ein nicht-komprimiertes Bytefeld übertragen. Wenn du also vorher ein JPG hattest, kommt dann durch ImageIcon ein ARGB-Feld raus, und das ist ungleich größer. Also: Geht, aber nicht so tolle.

ImageIO wurde ja schon genannt:

static boolean	write(RenderedImage im, String formatName, OutputStream output) 

Damit kann du das Bild schreiben, ein eigenes write-/readObject() hilft und fertig ist.


----------



## RawBit (5. Nov 2012)

Das mit dem byte Array klappt alles wunderbar - ich bin glücklich, daß ich nicht zu ImageIcon greifen musste :33


----------

