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.