Wie lässt sich eine Komponente als Bild speichern?

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

Die Beispielklasse erzeugt einen JFrame mit einem JButton, der beim klasseneigenen ActionListener angemeldet wird. Die Methode actionPerformed() des Listeners ruft saveCompAsImg() auf. Sie enthält die für die Generierung eines *.jpg notwendige Funktionalität.

Es soll ein von der Instanzvariablen 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;
import javax.swing.SwingUtilities;

class SpeichereComponenteALsBildClass implements ActionListener {

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

    public SpeichereComponenteALsBildClass() {
        init();
    }
    
    private void init() {
        JFrame frame = new JFrame("Komponente als Bild");
        jpanel = new JPanel();
        JButton b = new JButton("Save me!");
        b.addActionListener(this);
        jpanel.add(b);
        frame.setSize(300, 300);
        frame.add(jpanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private void saveCompAsImg() {
        // 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();
        }
    }

    public void actionPerformed(ActionEvent e) {
        saveCompAsImg();
    }
    
    public static void main(String args[]) {
        SwingUtilities.invokeLater(() -> new SpeichereComponenteALsBildClass());
    }
}

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

Komponente als Bild angezeigt