⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imageprocessingtest.java

📁 sun公司开发的,java2核心技术,卷II:高级性能,包括一系列的高级java应用技术,如数据库德连接,高级swing,多线程,软件本地化等等,本文件中则包含该书中的所用实例,配合该书使用,使对ja
💻 JAVA
字号:
/**
 * @version 1.0 1999-09-12
 * @author Cay Horstmann
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;

public class ImageProcessingTest
{  public static void main(String[] args)
   {  JFrame frame = new ImageProcessingFrame();
      frame.show();
   }
}

class ImageProcessingFrame extends JFrame
   implements ActionListener
{  public ImageProcessingFrame()
   {  setTitle("ImageProcessingTest");
      setSize(300, 400);
      addWindowListener(new WindowAdapter()
         {  public void windowClosing(WindowEvent e)
            {  System.exit(0);
            }
         } );

      Container contentPane = getContentPane();
      panel = new ImageProcessingPanel();
      contentPane.add(panel, "Center");

      JMenu fileMenu = new JMenu("File");
      openItem = new JMenuItem("Open");
      openItem.addActionListener(this);
      fileMenu.add(openItem);

      exitItem = new JMenuItem("Exit");
      exitItem.addActionListener(this);
      fileMenu.add(exitItem);

      JMenu editMenu = new JMenu("Edit");
      blurItem = new JMenuItem("Blur");
      blurItem.addActionListener(this);
      editMenu.add(blurItem);

      sharpenItem = new JMenuItem("Sharpen");
      sharpenItem.addActionListener(this);
      editMenu.add(sharpenItem);

      brightenItem = new JMenuItem("Brighten");
      brightenItem.addActionListener(this);
      editMenu.add(brightenItem);

      edgeDetectItem = new JMenuItem("Edge detect");
      edgeDetectItem.addActionListener(this);
      editMenu.add(edgeDetectItem);

      negativeItem = new JMenuItem("Negative");
      negativeItem.addActionListener(this);
      editMenu.add(negativeItem);

      rotateItem = new JMenuItem("Rotate");
      rotateItem.addActionListener(this);
      editMenu.add(rotateItem);

      JMenuBar menuBar = new JMenuBar();
      menuBar.add(fileMenu);
      menuBar.add(editMenu);
      setJMenuBar(menuBar);
   }

   public void actionPerformed(ActionEvent evt)
   {  Object source = evt.getSource();
      if (source == openItem)
      {  JFileChooser chooser = new JFileChooser();
         chooser.setCurrentDirectory(new File("."));

         chooser.setFileFilter(new
            javax.swing.filechooser.FileFilter()
            {  public boolean accept(File f)
               {  String name = f.getName().toLowerCase();
                  return name.endsWith(".gif")
                     || name.endsWith(".jpg")
                     || name.endsWith(".jpeg")
                     || f.isDirectory();
               }
               public String getDescription()
               {  return "Image files";
               }
            });

         int r = chooser.showOpenDialog(this);
         if(r == JFileChooser.APPROVE_OPTION)
         {  String name
               = chooser.getSelectedFile().getAbsolutePath();
            panel.loadImage(name);
         }
      }
      else if (source == exitItem) System.exit(0);
      else if (source == blurItem) panel.blur();
      else if (source == sharpenItem) panel.sharpen();
      else if (source == brightenItem) panel.brighten();
      else if (source == edgeDetectItem) panel.edgeDetect();
      else if (source == negativeItem) panel.negative();
      else if (source == rotateItem) panel.rotate();
   }

   private ImageProcessingPanel panel;
   private JMenuItem openItem;
   private JMenuItem exitItem;
   private JMenuItem blurItem;
   private JMenuItem sharpenItem;
   private JMenuItem brightenItem;
   private JMenuItem edgeDetectItem;
   private JMenuItem negativeItem;
   private JMenuItem rotateItem;
}

class ImageProcessingPanel extends JPanel
{  public void paintComponent(Graphics g)
   {  super.paintComponent(g);
      if (image != null)
         g.drawImage(image, 0, 0, null);
   }

   public void loadImage(String name)
   {  Image loadedImage
         = Toolkit.getDefaultToolkit().getImage(name);
      MediaTracker tracker = new MediaTracker(this);
      tracker.addImage(loadedImage, 0);
      try { tracker.waitForID(0); }
      catch (InterruptedException e) {}
      image = new BufferedImage(loadedImage.getWidth(null),
         loadedImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
      Graphics2D g2 = image.createGraphics();
      g2.drawImage(loadedImage, 0, 0, null);

      repaint();
   }

   private void filter(BufferedImageOp op)
   {  BufferedImage filteredImage
         = new BufferedImage(image.getWidth(), image.getHeight(),
            image.getType());
      op.filter(image, filteredImage);
      image = filteredImage;
      repaint();
   }

   private void convolve(float[] elements)
   {  Kernel kernel = new Kernel(3, 3, elements);
      ConvolveOp op = new ConvolveOp(kernel);
      filter(op);
   }

   public void blur()
   {  float weight = 1.0f/9.0f;
      float[] elements = new float[9];
      for (int i = 0; i < 9; i++)
         elements[i] = weight;
      convolve(elements);
   }

   public void sharpen()
   {  float[] elements =
         {  0.0f, -1.0f, 0.0f,
            -1.0f,  5.f, -1.0f,
            0.0f, -1.0f, 0.0f
         };
      convolve(elements);
   }

   void edgeDetect()
   {  float[] elements =
         {  0.0f, -1.0f, 0.0f,
            -1.0f,  4.f, -1.0f,
            0.0f, -1.0f, 0.0f
         };
      convolve(elements);
   }

   public void brighten()
   {  float a = 1.5f;
      float b = -20.0f;
      RescaleOp op = new RescaleOp(a, b, null);
      filter(op);
   }

   void negative()
   {  byte negative[] = new byte[256];
      for (int i = 0; i < 256; i++)
         negative[i] = (byte)(255 - i);
      ByteLookupTable table = new ByteLookupTable(0, negative);
      LookupOp op = new LookupOp(table, null);
      filter(op);
   }

   void rotate()
   {  AffineTransform transform
         = AffineTransform.getRotateInstance(Math.toRadians(5),
            image.getWidth() / 2, image.getHeight() / 2);
      AffineTransformOp op = new AffineTransformOp(transform,
         AffineTransformOp.TYPE_BILINEAR);
      filter(op);
   }

   private BufferedImage image;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -