JPanel als JPG speichern - Qualität anpassen?

schnuffie

Erfahrenes Mitglied
Hallo Leute,

ich erstelle ein JPG von einem JPanel mit jede Menge "Gezeichnetem".
Soweit, so gut.

Mein Problem ist, daß die JPG-Qualität fest eingestellt bei 0.75 (= 75%) lt. Javadoc liegt. Leider steht dort nicht, wie man die ändern kann.

Ich erstelle mein Bild so:
Code:
  BufferedImage img = new BufferedImage(200, 300, BufferedImage.TYPE_INT_RGB);
  myPanel.paint(img.createGraphics());
  ImageIO.write(img, "jpg", new File("d:\\bild.jpg"));

Wie bereits bemerkt, klappt das auch ganz gut, jedoch läßt die Qualität zu wünschen übrig (Anlage).

Gefunden habe ich in der Javadoc auch ein Objekt, mit dem das möglich sein könnte:
Code:
  javax.imageio.ImageWriteParam, Methode setCompressionQuality(float quality)

Nur leider kann ich damit nichts anfangen, da ich dieses Objekt mit dem BufferedImage oder dem ImageIO nicht in Verbindung bringen kann - b.z.w. nicht weiß, wie das gehen soll.:confused:

Hoffe Ihr könnt mir helfen.

P.S.: Vielleicht hat ja auch jemand eine Idee, ohne das JAI-Package GIFs zu speichern.
 

Anhänge

  • unbenannt.jpg
    unbenannt.jpg
    4,9 KB · Aufrufe: 609
Hallo!

Code:
/*
 * Created on 03.02.2005@21:37:29
 *
 * TODO Licence info
 */
package de.tutorials;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class PerfectImageTest {

    public static void main(String[] args) throws Exception {
        BufferedImage in = ImageIO.read(new File("c:/Beispiel.jpg"));
        IIOImage img = new IIOImage(in, null, null);
        ImageWriter writer = ImageIO.getImageWritersBySuffix("jpeg").next();
        ImageWriteParam param = writer.getDefaultWriteParam();
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(1.0F);
        writer.setOutput(ImageIO.createImageOutputStream(new File(
                "c:/perfect_sample.jpg")));
        writer.write(null, img, param);
    }
}

Gruß Tom
 
Danke Tom für die schnelle Antwort. Ich habe die Sache so umgesetzt:

Code:
Iterator it = ImageIO.getImageWritersBySuffix("jpeg");

if (it.hasNext()) {

BufferedImage img = new BufferedImage(200, 300, BufferedImage.TYPE_INT_RGB);

c.paint(img.createGraphics());

IIOImage iio = new IIOImage(img, null, null);

ImageWriter out = (ImageWriter)it.next();

ImageWriteParam param = out.getDefaultWriteParam();

param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

param.setCompressionQuality(fQuality);

out.setOutput(ImageIO.createImageOutputStream(imgFile));

out.write(null, iio, param);

}

Leider erscheint der Hintergrund stets in schwarz. Mit "setBackgroundColor(Color.white)" am Component-Objekt habe ich keinen Erfolg.

Wie kann ich den Hintergrund "bewegen" meine Hintergrundfarbe anzunehmen? :confused:
 

Neue Beiträge

Zurück