Wie lässt sich eine Komponente als Bild speichern?
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.