zu hohe Komprimierung

Benzol

Erfahrenes Mitglied
Ich erzeuge kleingerechnete Bilder durch ein BufferedImage. Dieses Bild schreibe ich dann mit ImageIO.Write in die Datei. Leider sehen die Ergebnisse bei einem 640x480 Bild sehr grobkörnig aus. Hat einer eine Idee?

Code:
                    String filename = kundenid+".jpg";
                    //Neue JPG-Datei erstellen
                    File file = new File(tmpdir+filename);
                    //Bild speichern
                    ImageIO.write(rendImage, "jpg", file);
 
Hallo Benzol,

mit AffineTransform.getScaleInstance() erhält man auch gute Skalierungserbgebnisse:

Java:
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageScaleDown {

	private BufferedImage scaledBufImage;

	private BufferedImage origBufImage;

	public ImageScaleDown(String filenameorpath) {
		try {
			origBufImage = ImageIO.read(new File(filenameorpath));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		ImageScaleDown isd = new ImageScaleDown("Sonnenuntergang.jpg");
		isd.scaleImage(2.0);
		isd.writeScaledImage("scaledAsPng.png");
		isd.scaleImage(3.0);
		isd.writeScaledImage("scaledAsJpg.jpg");
	}

	public void scaleImage(double scaledown) {
		int newWidth = (int) ((double) origBufImage.getWidth() / scaledown);
		int newHeight = (int) ((double) origBufImage.getHeight() / scaledown);
		scaledBufImage = new BufferedImage(newWidth, newHeight,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = scaledBufImage.createGraphics();
		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BICUBIC);
		AffineTransform at = AffineTransform.getScaleInstance(1.0/scaledown,
				1.0/scaledown);
		g2.drawRenderedImage(origBufImage, at);
		g2.dispose();
	}

	public void writeScaledImage(String filenameorpath) {
		String format = filenameorpath.substring(filenameorpath
				.lastIndexOf(".") + 1);
		if (scaledBufImage != null) {
			try {
				ImageIO.write(scaledBufImage, format, new File(filenameorpath));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}


Vg Erdal
 
Vielen Dank Euch beiden. Der Verweis von Thomas hat mir schon sehr geholfen. Mit einer Komprimierung von 0.9 habe ich ein optimum an Qualität und Schärfe.
 
Zurück