Socket BufferedImage senden "ohne speichern"

Bitstubbi

Mitglied
Morgen zusammen.

Ich möchte ein Bild von GUI zu GUI schicken (also nur von links nach rechts) jedoch hab ich Probleme mit dem Serialisieren des BufferedImage. Bisher hat google//Sufu ergeben, das man das Image runterbrechen muss. Jedoch haben diese Lösungen das Bild nur übertragen und nicht in einer Gui angezeigt. Ich möchte das bild auch gar nicht speichern. auf Knopfdruck soll eigentlich nur EIN Screenshot übertragen werden.
Code:
java.io.NotSerializableException: java.awt.image.BufferedImage
Meine bisherige Fehlermeldung ist wohl selbsterklärend. Hier noch ein wenig Code:
Client:
Java:
public class Client implements Runnable{

	private ObjectOutputStream oos = null;
	private BufferedImage screen;
	private Socket c_socket;
	private int port;
	private Capture c;

	public Client(int ip){
		this.port=ip;
		doInit();
		Thread t = new Thread(this);
		t.start();
	}
	
	private void doInit() {
		try {
			c = new Capture();
			c_socket= new Socket("localhost",port);
			oos=new ObjectOutputStream(c_socket.getOutputStream());
			} catch (IOException e) {
			System.err.println(e.toString()+"("+(int)(Math.random()*100)+")");
		}
		
	}
	

	public void run() {
		while(true){
			c.captureScreen();
			screen = c.getScreen();
			System.err.println(screen.getHeight());
		try {
			Thread.sleep(200);
		} catch (InterruptedException e1) {
			System.err.println(e1.toString());
		}
		try {
				System.out.println("send To Server ");
				oos.writeObject(screen);
				oos.flush();
				
			}
			
			catch (IOException e) {
				System.err.println(e.toString());
			}
			
		}
	
	}

	}

Server ist 0815 Empfänger nix erwähnenswertes
 
Und wo ist jetzt der essenzielle Unterschied, zwischen "das übertragene Bild an einen FileOutPutStream übergeben" und "das übertragene Bild an eine GUI-Komponente übergeben"?

bye
TT
 
Also muss ich das folglich runterbrechen? ... nun ja außer das man nicht mit .IO arbeiten muss gibt es eigentlich keinen. Finde kein aussagekräftiges Beispiel Seite in der API, damit wäre mir schon geholfen. Es wird immer zuerst das Bild gespeichert, dann angezeigt.
 
grundsätzlich solltest du dir angewöhnen das ein catch-block im besten fall so aussieht

Java:
catch(Exception e)
{
e.printStackTrace();
}

ein einfaches Throwable.toString() reicht meist nicht aus ... klar sagt es aus WAS kaputt is ... aber nicht WO und WARUM ... dafür braucht man den kompletten StackTrace ...


zum problem selbst

BufferedImage kannst du nicht serialisieren ... also nicht einfach in einen ObjectOutputStream stecken .. außerdem würde es wenig sinn machen da man sehr viel overhead mitschicken müsste ... denn innerhalb eines BufferedImages werden die daten RAW gespeichert ... also mindestens (höhe x breite) x 4 ... und selbst wenn man es durch n compress-stream schiebt wird sich das nicht viel bessern ...

also nutzt man hier ImageIO ... und anstatt das bild in eine datei zu schreiben schiebt man es direkt in den stream ... welchen algorithmus man anwendet um z.b. bandbreite zu sparen oder die qualität zu erhalten ist sicherlich abhängig von der aufgabe ...

auch sollte man es interpoliert machen ... also nur die unterschiede schicken statt jedes mal ein komplettes bild ... das macht video-streaming überhaupt erst sinnvoll möglich ... was jetzt bei einzelnen screen-shots eher weniger ein problem sein sollte ... aber nur so als beigeschmack mal im hinterkopf behalten ...


was du mit "bild speichern" meinst ist mir auch nicht wirklich klar ... es ist doch völlig egal in was für einen stream du letztendlich schreibst ... so lange es ein OutputStream ist und die methode einen solchen verlangt musst du dich über das ziel nicht kümmern
 
Also die API sagt:
JLabel (Java Platform SE 7 )
In in Icon (Java Platform SE 7 ) sieht mann, dass es von [JAPI]ImageIcon[/JAPI] implementiert wird, welches ein Vorfahre von [JAPI]BufferedImage[/JAPI] ist.

Noch Fragen Kiensle?

bye
TT

ich denke das problem dürfte weniger das anzeigen als das übertragen sein ... und da "Icon" nun mal NICHT Serializable implementiert kann man es wie auch immer nicht durch einen ObjectOutputStream schicken
 

Zurück
Oben