BufferedImage => Byte[] => BufferedImage

javaboon

Grünschnabel
Abend,
ich hab mal ne Frage. Suche schon seit langem einen weg nen Bild in Form eines BufferedImages über Socket zu versenden. Jetzt fang ich nochmal von vorne an. Doch nichtmal dieser Codeschnipsel funktioniert:
BufferedImage srcImage = ImageIO.read(new File("c:/winter.jpg"));
int i = 0;
byte[] imageData = ((DataBufferByte) srcImage.getData().getDataBuffer()).getData();
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageData));
ImageIO.write(image, "jpeg", new File("C:/bla.jpg"));

Den Fehler dürftet ihr kennen, ich komm nicht dahinter. Trotdem mal die Fehlermeldung:

Exception in thread "main" java.lang.IllegalArgumentException: im == null!
at javax.imageio.ImageIO.write(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)
at virclient.main(virclient.java:20)

Schonmal vielen Dank
 
Warum castest du denn auf DataBufferByte wo du dir gar nicht sicher sein kannst, dass es sich um einen solche handelt?

Korrekt wäre es, das Bild mit ImageIO.write in einen ByteArrayOutputStream zu schreiben. Von dem kannst du dann das byte-Array erfragen und das ganze über den ByteArrayInputStream wieder auslesen.

Wenn du direkt die Datei hast, kannst du allerdings auch ohne dem Umweg über das BufferedImage einfach die Datei in ein ByteArray einlesen.
 
mit der zeit fang ich an zu verzweifeln^^
den code hab ich einfach aus dem forum hier genommen in der hoffnung es t so...
wie kann ich mir das vorstelle?
fürn codeasuschnitt wär ich sehr dankbar ;D
 
Suche mal nach "ScreenProvider", da gibt es ein Beispiel am Ende des Threads, welches angeblich auch schneller als ImageIO ist.
 
dann noch eine ganz blöde frage
wieso wird bei mir in eclipse das

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

und alle dazugehörigen codes als falsch markiert?
 
Weil man auf die Klassen im allgemeinen besser nicht zugreifen sollte, weil sie nicht offiziell gesupported werden. Da sich aber niemand daran hält kannst du das ignorieren, unter Property kannst du auch irgendwo einstellen, wann ein Fehler, eine Wahnung angezeigt oder wann es ignoriert werden soll.
 
es tut mir leid aber es geht immer noch nichts
ich versteh nur nicht warum
habs 1:1 aus dem beitrag kopiert
hier die fehlermeldung für DelegationServer:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
RemotePOATie cannot be resolved to a type
RemotePOATie cannot be resolved to a type
The method object_to_string(Object) in the type ORB is not applicable for the arguments (Remote)

at DelegationServer.main(DelegationServer.java:28)

und für den GUIClient:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method dump(int, int, int[]) is undefined for the type Remote
RemoteHelper cannot be resolved

at GUIClient.<init>(GUIClient.java:65)
at GUIClient.main(GUIClient.java:93)

*edit
auch versteh ich nicht wie das funktionieren sollte, es wird weder ne ip noch nen port benötigt...
 
Zuletzt bearbeitet:
Hallo,

zeja meinte wohl sowas in der Art:
Java:
package de.tutorials.reima.examples;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.ImageIO;

public class ImageTransfer {
	public static void main(String[] args) {
		Thread serverThread = new Thread(new Server());
		serverThread.start();
		
		try {
			BufferedImage image = ImageIO.read(new File("sent.png"));
			Socket socket = new Socket(InetAddress.getLocalHost(), 4242);
			ImageIO.write(image, "png", socket.getOutputStream());
			serverThread.join();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static class Server implements Runnable {
		@Override
		public void run() {
			try {
				ServerSocket socket = new ServerSocket(4242);
				Socket client = socket.accept();
				BufferedImage image = ImageIO.read(client.getInputStream());
				ImageIO.write(image, "png", new File("received.png"));
				client.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}		
	}
}

Grüße,
Matthias
 
Hier nochmal zur Vereinfachung der Link: http://www.tutorials.de/forum/java/...g-war-remote-anwendung-corba.html#post1353824
Ich sagte, du sollst das Beispiel am Ende des Threads nehmen, mit einen Wort das von Tom. Cobra kenne ich nur vom hören, aber ich denke du wirst dafür eine Lib. brauchen.

Dort wartet der Server in Zeile 92 auf ankommende Verbindungen an Port 4711, und der Client baut in Zeile 30 eine Verbindung auf. Falls du vorhast eine RDC-Anwendung zu schreiben denke daran, dass es aufgrund der verschoben dargestellten Titelleiste des Clienten auf einen Rechner (außer du emulierst, wie er gesagt hat) nicht richtig testbar sein wird.
 
danke :)
ich habs abe immer noch nicht
nun bei beiden eine ähnliche fehlermeldung, bei ScreenConsumer:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

at ScreenConsumer.main(ScreenConsumer.java:22)

und bei ScreenProvider:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

at ScreenProvider.main(ScreenProvider.java:44)
 
Zurück