# Image erzeugen aus empfangenen Daten



## UdjENE (9. Jul 2007)

hi, ich bekomme über den Socket Daten gesendet aus denen ein JPG erstellt und angezeigt werden soll. Die Daten kommen in dem Format: *<jpg:10758>ÿØÿà%&'()*4...* innerhalb der spitzen Klammern steht die Länge der Imagedaten sowie das Bildformat. hatte bis jetzt folgenden ansatz:

ich lese die Länge aus und gehe in einer while-Schleife den darauffolgenden Inputstream durch und speicher ihn in einen String:

```
//Länge auslesen
while((imageSize=(char)input.read())!='>'){
	tmplength += String.valueOf(imageSize);
}

length = Integer.parseInt(tmplength); 
					
String ImageString="";

//Inhalt auslesen					
while(length>0){
  length--;
  ImageString += (char)input.read();
}
```

mein Problem ist nun, dass ich nicht weiss, wie ich aus den gesammelten Daten ein Image erzeuge. habe es mal so versucht: *img = ImageIO.read(ImageIO.createImageInputStream(ImageString));* hat aber leider zum Error geführt.

hat vlt jemand eine Idee?


----------



## tuxedo (9. Jul 2007)

Naja, schreibe die gesammelten daten byte(array)-weise in eine File, und gibt der die passende Endung, je nachdem was du in <..> vorgegeben bekommst. Nachdem du alles in eine Datei geschrieben hast kannst du noch die Dateilänge mit dem was du in <..> gelesen hast vergleichen. 

Also nochmal im PseudoCode


```
Werte <> aus:
---> Splitte anhand des ":", alles Links davon: Merken als Dateiendung, alles rechts davon: merken als long-Wert

Erstelle Ein Dateihandle mit Namen XYZ und der gefundenen Dateiendung

Solange Daten ankommen:
---> Schreibe diese per write(byte[]) in die Datei gemäß Filehandle

Socket schließen oder nächste Datei empfangen...
```

- Alex


----------



## HoaX (9. Jul 2007)

also die daten in einem string zu speichern is ne schlechte idee. nimm lieber einen ByteArrayOutputStream. dach dem schreiben aller daten in diesen erstellt du einen neuen ByteArrayInputStream mit den toByteArray-Daten des outputstreams und gibts diesen inputstream dann an ImageIO.read(InputStream)


----------



## UdjENE (10. Jul 2007)

danke für die tipps.

@alex:
da es sich um ein applet handelt kann ich die Bilddatei nicht als File speichern. will ich auch nicht, denn das empfangene Bild soll nur angezeigt werden.

@HoaX:
daran habe ich auch schon gedacht. aber wie schreibe ich die empfangenen Daten in einen ByteArrayOutputStream???

mein Ansatz:

```
ByteArrayOutputStream outbyte = new ByteArrayOutputStream();

while(length>0){
	length--;
	outbyte.write(input.read());
}
ByteArrayInputStream inbyte = new ByteArrayInputStream(outbyte.toByteArray());
img = ImageIO.read(inbyte);
repaint();
```
klappt leider nicht. Bild wird fehlerhaft dargestellt!


----------



## tuxedo (10. Jul 2007)

Vielleicht helfen "memory mapped files" dir weiter: 

http://www.exampledepot.com/egs/java.nio/CreateMemMap.html


----------



## HoaX (10. Jul 2007)

doch genau so sollte es gehn. sicher dass die daten korrekt sind die da kommen? bzw ist es ein vielfaches schneller ganze blöcke zu lesen statt immer einzelne bytes.


----------



## UdjENE (11. Jul 2007)

hast recht gehabt, die ankommenden Daten wurden falsch gesendet. klappt jetzt.
aber wie lese ich denn ganze blöcke, anhand der bekannten Länge der ankommenden Bytes???


----------



## tuxedo (11. Jul 2007)

Die Anzahl der Bytes die auf einmal gelesen werden ist abhängig von dem Byte-Array das du deiner Read-Methode als Argument gibst...


----------

