package javacodebook.media.graphic.brightness; import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.JPanel; /** * Ein Panel, dass eine Grafik auf sich selbst darstellt, in der Originalgröße. * Die Helligkeit kann beliebig eingestellt werden. */ public class ImagePanel extends javax.swing.JPanel { //Die Grafik, die angezeigt werden soll private Image image; private BufferedImage buffer; private float brightness = 1.0f; /** Austauschen der Grafik */ 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); drawImage(); } } /** Setzen des Faktors für die Helligkeitsberechnung */ public void setBrightness(float value) { this.brightness = value; if(buffer != null) drawImage(); } /** 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); } /** Hier wird der Filter angewendet, um die Helligkeit einzustellen. Würden * die Aktionen in der Methode paintComponent() stehen, so würden sie bei * jedem Scrollen einer Grafik in einer JScrollPane ausgeführt. Damit * würden unnötig viele Objekte erzeugt und wieder verworfen. */ private void drawImage() { //Graphics-Objekt für das BufferedImage holen Graphics2D g2 = (Graphics2D) buffer.getGraphics(); //Grafik zeichnen g2.drawImage(image, 0,0, this); //Grafik mit Hilfe eines Filters heller/dunkler zeichnen RescaleOp filterOp = new RescaleOp(brightness, 0, null); buffer = filterOp.filter(buffer, null); } /* 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.brightness; import java.awt.*; import java.io.*; import javax.swing.*; /** Ein einfaches Programm zur Bildanzeige und Manipulation der Helligkeit. */ public class ImageFrame extends javax.swing.JFrame { private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane scrollPane; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel2; private javax.swing.JFileChooser fileChooser; private javax.swing.JSlider jSlider1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JPanel jPanel1; private javax.swing.JMenu jMenu1; private javax.swing.JMenuBar jMenuBar1; private ImagePanel imagePanel; public ImageFrame() { initComponents(); } private void initComponents() { fileChooser = new javax.swing.JFileChooser(); jPanel1 = new javax.swing.JPanel(); jSlider1 = new javax.swing.JSlider(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jPanel2 = new javax.swing.JPanel(); scrollPane = new javax.swing.JScrollPane(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); jPanel1.setLayout(new java.awt.BorderLayout()); jSlider1.setMaximum(200); jSlider1.setMinimum(1); jSlider1.setOrientation(javax.swing.JSlider.VERTICAL); jSlider1.setPaintLabels(true); jSlider1.setValue(100); jSlider1.setEnabled(false); jSlider1.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { brightnessChanged(evt); } }); jPanel1.add(jSlider1, java.awt.BorderLayout.CENTER); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText("Heller"); jPanel1.add(jLabel1, java.awt.BorderLayout.NORTH); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setText("Dunkler"); jPanel1.add(jLabel2, java.awt.BorderLayout.SOUTH); getContentPane().add(jPanel1, java.awt.BorderLayout.EAST); jPanel2.setLayout(new java.awt.BorderLayout()); jPanel2.add(scrollPane, java.awt.BorderLayout.CENTER); getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER); jMenu1.setText("Datei"); jMenuItem1.setText("\u00d6ffnen"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openFile(evt); } }); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); setJMenuBar(jMenuBar1); pack(); } /** Diese Methode ist als Listener beim Schieberegler registriert * und erfasst Änderungen. Diese werden über den Massstab umgerechnet und * als Alpha-Wert an das ImagePanel weitergegeben. */ private void brightnessChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_brightnessChanged float value = jSlider1.getValue(); value = value/100; //Da der Wert 2 noch keine Starke Erhöhung der Helligkeit bedeutet, //müssen wir ein Streckung vornehmen. if(jSlider1.getValue() > 100) value = (float)Math.pow((double)value, 1.5*value); imagePanel.setBrightness(value); imagePanel.repaint(); } /** Grafikdatei öffnen und anzeigen. Dabei wird der Schieberegler wieder * auf den Ausgangswert gesetzt. */ private void openFile(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openFile int pressedButton = fileChooser.showOpenDialog(this); if(pressedButton == JFileChooser.APPROVE_OPTION) { File f = fileChooser.getSelectedFile(); ImageIcon icon = new ImageIcon(f.getAbsolutePath()); if(imagePanel == null) { imagePanel = new ImagePanel(); imagePanel.setImage(icon.getImage()); scrollPane.getViewport().setView(imagePanel); jSlider1.setEnabled(true); } else imagePanel.setImage(icon.getImage()); jSlider1.setValue(100); this.repaint(); } } private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm System.exit(0); } public static void main(String args[]) { ImageFrame frame = new ImageFrame(); frame.setSize(640, 480); frame.show(); } }