# Java BufferedImage mit in eine Datei speichern



## meckiebro (11. November 2010)

Hallo zusammen,
Ich möchte ein BufferedImage in eine XML Datei mitspeichern.
Dies funktioniert auch soweit.
Meine Frage ist jetzt. Reduziert das immer wieder abspeichern der Datei die Bildqualität, da ich das ja als JPG konvertiere?

Hier mal mein Code um das Bild umzuwandeln

```
private static String fromBufferedImageToString(BufferedImage bufferedImage){
		return new BASE64Encoder().encode(toByteArray(bufferedImage));
	}
	
	
	private static byte[] toByteArray(BufferedImage bufferedImage){
		if(bufferedImage != null){
			ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
			try {
				ImageIO.write(bufferedImage, "jpg", byteArrayOS);
			} catch (IOException e) {
				e.printStackTrace();
			}
			byte[] b = byteArrayOS.toByteArray();
			return b;
			
			//fast 8x größer
//			return ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
		}
		return new byte[0];
	}
```

Wenn ich die untere Variante nutze die ich im Forum hier gefunden habe ist die datei 8x größer. Das speichern als PNG macht es auch nicht besser da bin ich bei 6x größer.

Das Problem ist einfach das ich verhindern will das die Qualität bei jedem speicherverlust abnimmt. Geht das irgendwie? Oder müsste ich dazu nachdem bspw. das Bild geladen wurde einmal das bild kodieren und dann diese kodierung immer zum speichern und laden nutzen.


----------



## Billie (12. November 2010)

Du änderst die einmal gespeicherten Daten ja eigentlich nicht, oder? Dann hast Du nur den Qualitätsverlust der bei der JPEG-Konvertierung entsteht und da kannst den Qualitätsgard ja setzten.

Eine andere Möglichkeit wäre Du speichert das Bild unkonvertiert, also sozusagen die Rohdaten, und diese aber ZIP komprimiert.


----------



## meckiebro (12. November 2010)

Naja sagen wir so. Mein Programm lädt das Bild zuerst aus dem Internet und macht daraus ein BufferedImage. Dann speicher ich mein "Projekt" und es wird wie oben gezeigt abgespeichert. Dann lade ich die Datei nach dem Programmneustart bspw. wieder und mache aus dem Code wieder ein BufferedImage. Dannach speicher ich es wieder ab wie oben beschrieben. Und so weiter....

Und ich dachte jetzt wenn ich ein komprimiertes Bild lade und es wieder neu komprimiere das ich da immer ein bisschen verlust habe. Sicher bin ich mir da aber wie gesagt immer noch nicht.


----------

