BufferedImage => Byte[] => BufferedImage

Das kann ich mir irgendwie nicht vorstellen, in beiden Fällen ist dort eine schließende Klammer, und die Formation ist absolut korrekt. Kontrolliere besser noch mal, ob sich bei dir die Zeilen irgendwie verschoben habe, und der Trace auf eine andere zeigt.
 
danke matthias deins hat funktioniert :)
aber warum nur in png und nicht in jpg?
habs umgeschrieben und gieng nicht :(
und wie ist der datenverlust von 896 auf 847 kb zu erklären? ;D
 
Threadpushing ist hier unerwünscht, ebenso wie durchgehende Kleinschreibung. Halte dich doch bitte an die Netiquette, der du mit der Anmeldung auf tutorials.de zugestimmt hast. Danke.

danke matthias deins hat funktioniert :)
aber warum nur in png und nicht in jpg?
habs umgeschrieben und gieng nicht :(
und wie ist der datenverlust von 896 auf 847 kb zu erklären? ;D
Könntest du etwas präziser erläutern, was genau du umgeschrieben hast und was dann nicht ging? Und von welchem Datenverlust sprichst du?

Grüße,
Matthias
 
Dann werd ich jetzt versuchen, der deutschen Grammatik treu zu bleiben. :)
Es handelt sich nicht um ein Problem, ich frage mich lediglich woran es liegen könnte. Ich habe das Bild mit deinem Code in ein BufferedImage geschrieben, an localhost gesendet und wieder als Bilddatei abgespeichert. Nur unterscheiden sich diese zwei Bilder nun in ihrer Größe. Das "Ausgangsbild" ist 896kb groß und das versendete, und neu geschriebene Bild nurnoch 847kb.
Auch habe ich versucht, ein Bild im jpg Format zu versenden. Ich habe einfach jedes png (aus deinem Code und die Dateien natürlich) durch jpg ersetzt, das funktionierte jedoch nicht :( Nun frage ich mich (euch) warum.
Herzlichen Dank
 
Ich weiß, dass Threathpushing unerwünscht ist, aber ich kenne mich nicht sehr mit Java aus und würde doch gerne erfahren wie diese Abweichung der Dateigröße zustande kommt und warum es nicht geklappt hat, dass ich im Quellcode alle "png" mithilfe von suchen und ersetzen durch "jpg" ersetzt habe. Ich hoffen dass mir das einer von euch erklären kann :) Ich steh schon seit ner Woche ohne Antwort dar :(
Ich bitte und danke euch um/für jede Hilfe.
Julian
 
Der Datenverlust kommt dadurch zustande, dass ImageIO beim Lesen des Bildes ein BufferedImage erstellt. Beim Schreiben rechnet/komprimiert ImageIO dieses BufferedImage wieder in das angegebene Format um, erzeugt also ein komplett neues Bild. Das hat nichts mehr mit der Originaldatei zu tun.

Wenn du einfach nur das Originalbild schicken willst, wieso dann dieser riesen Aufwand das Bild zig mal umzuwandeln? Les doch einfach direkt die Datei aus und verschicke die gelesenen Bytes.

Server 1:

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(1234);
			
			Socket client = server.accept();
			sendFile(client, new File("C:/test.jpg"));  //Es kann jede beliebige Datei verwendet werden
			
			client.close();
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private static void sendFile(Socket s, File f) throws IOException {
		if(f.isDirectory())
			throw new IllegalArgumentException("File cannot be a directory.");
		OutputStream out = s.getOutputStream();
		FileInputStream in = new FileInputStream(f);
		
		byte[] buffer = new byte[512];
		
		for(int i; (i = in.read(buffer)) != -1; ) {
			out.write(buffer, 0, i);
			out.flush();
		}
		
		in.close();
		out.close();
	}
}

Client 1:

Java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {
	public static void main(String[] args) {
		try {
			Socket serverConnection = new Socket(InetAddress.getLocalHost(), 1234);
			
			receiveFile(serverConnection, new File("received.jpg"));
			
			serverConnection.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void receiveFile(Socket s, File file) throws IOException {
		InputStream in = s.getInputStream();
		FileOutputStream out = new FileOutputStream(file);
		
		byte[] buffer = new byte[512];
		
		for(int i; (i = in.read(buffer)) != -1; ) {
			out.write(buffer, 0, i);
			out.flush();
		}
		
		in.close();
		out.close();		
	}
}

Ein BufferedImage selbst lässt sich meines Wissens nach nicht über ein OutputStream versenden. Allerdings kannst du folgendes Programm nutzen um selbst unkomprimierte Bilder (bmp) z.B. über das Internet zu versenden, da es das Bild vor dem Senden in ein beliebiges Format umwandelt.

Server 2:
Java:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.ImageIO;


public class Server {
	public static void main(String[] args) {
		try {
			ServerSocket server = new ServerSocket(1234);
			
			Socket client = server.accept();
			sendPicture(client, new File("D:/test.jpg"), true);
			
			client.close();
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private static void sendPicture(Socket socket, File f, boolean original) throws IOException {
		if(f.isDirectory())
			throw new IllegalArgumentException("File cannot be a directory.");
		
		if(original) {
			OutputStream out = socket.getOutputStream();
	        FileInputStream in = new FileInputStream(f);
	       
	        byte[] buffer = new byte[512];
	       
	        for(int i; (i = in.read(buffer)) != -1; ) {
	            out.write(buffer, 0, i);
	            out.flush();
	        }
	       
	        in.close();
	        out.close();
		} else {
			BufferedImage img = ImageIO.read(f);
			ImageIO.write(img, "jpg", socket.getOutputStream());
			//Das Bildformat kannst du hier beispielsweise in ein komprimiertes Format (jpg, png, ect.)
			//ändern um weniger Daten über das Netzwerk oder Internet versenden zu müssen.
			//Das Format in welches das Bild am Ende gespeichert wird kannst du Anhand der Dateiendung
			//in der Client-Klasse ändern.
			//Achtung: Dieser Programmteil wird nur ausgeführt, wenn "original == false"!
		}
	}
}

Client 2:

Java:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.imageio.ImageIO;

public class Client {
	public static void main(String[] args) {
		try {
			Socket serverConnection = new Socket(InetAddress.getLocalHost(), 1234);

			receivePicture(serverConnection, new File("D:/received.bmp"));

			serverConnection.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void receivePicture(Socket socket, File file) throws IOException {
		BufferedImage img = ImageIO.read(socket.getInputStream());
		//Das Speicherformat wird anhand der Dateiendung ausgelesen: "file.getName().substring(file.getName().lastIndexOf('.') + 1)"
		ImageIO.write(img, file.getName().substring(file.getName().lastIndexOf('.') + 1), file);
	}
}
 
Zuletzt bearbeitet:
Zurück