package javacodebook.media.graphic.greyscale; import java.awt.*; import java.awt.color.ColorSpace; import java.awt.image.*; import java.awt.geom.*; import javax.swing.JPanel; /** * Ein Panel, dass eine Grafik in Graustufen darstellt. Dabei * wird die Grafik in ihrer Originalgröße gezeigt. */ public class GreyscalePanel extends javax.swing.JPanel { //Die Grafik, die angezeigt werden soll private Image image; private BufferedImage buffer; /** Austauschen der Grafik und umrechnen in Graustufen */ public void setImage(Image image) { if(image != null && image.getWidth(this) > 0) { this.image = image; buffer = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_RGB); //Graphics-Objekt für das BufferedImage holen Graphics2D g2 = (Graphics2D) buffer.getGraphics(); //Grafik zeichnen g2.drawImage(image, 0,0, this); buffer = new ColorConvertOp( ColorSpace.getInstance(ColorSpace.CS_GRAY), null ).filter(buffer, null); } } /** Hier wird die Grafik zunächst auf ein BufferedImage gezeichnet, auf das * dann eine Filter-Operation ausgeführt wird. */ public void paintComponent(Graphics g) { super.paintComponent(g); if(buffer != null) g.drawImage(buffer, 0,0, this); } /* Es wird die Größe der Grafik als PreferredSize zurückgegeben */ public Dimension getPreferredSize() { if(image != null) return new Dimension(image.getWidth(this), image.getHeight(this)); return super.getPreferredSize(); } } --- Neue Klasse --- package javacodebook.media.graphic.greyscale; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; /** * Eine einfache Swing-Anwendung, um das GreyscalePanel anzuzeigen. */ public class ImageViewer extends JFrame { //das GreyscalePanel GreyscalePanel GreyscalePanel = null; /** Creates a new instance of ImageViewer */ public ImageViewer() { // setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); //Einen Button zum Öffnen von Dateien erstellen JPanel buttonPanel = new JPanel(); getContentPane().add(buttonPanel, BorderLayout.NORTH); JButton openButton = new JButton("Datei öffnen"); buttonPanel.add(openButton); //Einen ActionLister auf den Button legen, der einen FileChooser öffnet openButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { JFileChooser chooser = new JFileChooser(); int status = chooser.showOpenDialog(ImageViewer.this); if (status == JFileChooser.APPROVE_OPTION) { //ausgewählte Datei ermitteln und abspielen File file = chooser.getSelectedFile(); try { ImageIcon icon = new ImageIcon(file.getAbsolutePath()); //vorher evtl. noch vorhandenes GreyscalePanel entfernen if(GreyscalePanel != null) getContentPane().remove(GreyscalePanel); //das GreyscalePanel anzeigen GreyscalePanel = new GreyscalePanel(); GreyscalePanel.setImage(icon.getImage()); getContentPane().add(GreyscalePanel, BorderLayout.CENTER); //den Frame auf die entsprechende Größe anpassen pack(); } catch(Exception e) { e.printStackTrace(System.out); } } } }); } public static void main(String[] args) { ImageViewer viewer = new ImageViewer(); viewer.pack(); viewer.show(); } }