Wie lässt sich eine Komponente als Bild speichern?

Über ein neu erzeugtes BufferedImage lässt sich eine Komponente als Bilddatei abspeichern.

Die Beispielklasse erweitert JFrame und erzeugt ein einfaches Fenster mit einem JButton, der beim klasseneigenen ActionListener angemeldet wird. Die Methode actionPerformed() des Listeners enthält die für die Generierung eines *.jpg notwendige Funktionalität.

Es soll ein von der Instanzvariablen JPanel jpanel referenziertes JPanel gespeichert werden. Von diesem werden zunächst Höhe und Breite ermittelt und ein Dateiname vom Typ *.jpg und die gewünschte Kompressionsqualität als float-Wert festgelegt.
Dann wird ein RGB-BufferedImage-Objekt mit den ermittelten Maßen einschließlich seines Grafikkontextes erzeugt und dieser anschließend der paint()-Methode des Panels übergeben.

import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

class SpeichereComponenteAlsBildClass extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;

    public static void main(String args[]) {
        new SpeichereComponenteAlsBildClass();
    }

    JPanel jpanel;

    // Erstelle Frame, der nur das JPanel enthaelt
    public SpeichereComponenteALsBildClass() {
        jpanel = new JPanel();
        JButton b = new JButton("Save me!");
        b.addActionListener(this);
        jpanel.add(b);
        setSize(300, 300);
        getContentPane().add(jpanel);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {

        String fileName = "/Users/joecze/Desktop/SaveComponent.jpg";

        // Erstelle ein BufferedImage
        int w = jpanel.getWidth();
        int h = jpanel.getHeight();
        float quality = 1f;
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D big2d = bi.createGraphics();

        // Male das JPanel in das BufferedImage
        jpanel.paint(big2d);

        Iterator<ImageWriter> iter = ImageIO
                .getImageWritersByFormatName("jpeg");
        ImageWriter writer = (ImageWriter) iter.next();
        ImageWriteParam iwp = writer.getDefaultWriteParam();
        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        iwp.setCompressionQuality(quality);

        try {
            FileImageOutputStream fos = new FileImageOutputStream(new File(
                    fileName));
            writer.setOutput(fos);
            IIOImage img = new IIOImage((RenderedImage) bi, null, null);
            writer.write(null, img, iwp);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

Das Speichern und Codieren des *.jpg erfolgt über einen FileImageOutputStream wie in jpeg speichern beschrieben.

Komponente als Bild angezeigt