Image erzeugen aus empfangenen Daten

Status
Nicht offen für weitere Antworten.

UdjENE

Mitglied
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:
Code:
//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?
 
T

tuxedo

Gast
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

Code:
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

Top Contributor
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

Mitglied
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:
Code:
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!
 

HoaX

Top Contributor
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

Mitglied
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???
 
T

tuxedo

Gast
Die Anzahl der Bytes die auf einmal gelesen werden ist abhängig von dem Byte-Array das du deiner Read-Methode als Argument gibst...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben