Wie lässt sich eine Komponente als Bild speichern?
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.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.