import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import java.io.*; // 图像的模糊与锐化 by vincent public class BlurAndSharpenDemo extends JFrame implements ActionListener { private JPanel jPanel = new JPanel(); //面板jPanel用于容纳模糊、锐化、还原图像按钮 private JButton buttonFile; //打开图像文件按钮 private JButton buttonBlur; //模糊图像按钮 private JButton buttonSharpen; //锐化图像按钮 private JButton buttonReset; //还原图像按钮 ImagePanel imagePanel = new ImagePanel(); //创建ImagePanel对象用于绘制图像 //Download by http://www.codefans.net public BlurAndSharpenDemo() { super("图像的模糊与锐化演示"); //调用父类构造函数 Container contentPane = getContentPane(); //得到容器 buttonFile = new JButton("打开图像文件"); //实例化组件 buttonFile.addActionListener(this); //增加事件监听 buttonBlur = new JButton("模糊图像"); buttonBlur.addActionListener(this); buttonSharpen = new JButton("锐化图像"); buttonSharpen.addActionListener(this); buttonReset = new JButton("还原图像"); buttonReset.addActionListener(this); jPanel.add(buttonBlur); //增加组件到面板上 jPanel.add(buttonSharpen); jPanel.add(buttonReset); contentPane.add(jPanel, BorderLayout.SOUTH); //增加组件到容器上 contentPane.add(buttonFile, BorderLayout.NORTH); contentPane.add(imagePanel, BorderLayout.CENTER); //设置窗口 this.setSize(280, 230); //设置窗口大小 this.setVisible(true); //设置窗口可见 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序 } public void actionPerformed(ActionEvent e) { JButton button = (JButton)e.getSource(); //获取事件源 //打开图像文件按钮buttonFile事件处理 if(button==this.buttonFile) { JFileChooser chooser = new JFileChooser(); //实例化文件选择器 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); //设置文件打开模式为仅打开文件 chooser.setCurrentDirectory(new File(".")); //设置文件选择器当前目录 //设置图像文件过滤器 chooser.setFileFilter(new javax.swing.filechooser.FileFilter() { public boolean accept(File file) { //可接受的文件类型 String name = file.getName().toLowerCase(); return name.endsWith(".gif") || name.endsWith(".jpg") || name.endsWith(".jpeg") || file.isDirectory(); } public String getDescription() { //文件描述 return "图像文件"; } }); int result = chooser.showOpenDialog(this); //显示文件选择对话框 if (result == JFileChooser.APPROVE_OPTION) { //得到用户行为 String fileName = chooser.getSelectedFile().getAbsolutePath(); //得到选择的文件名 imagePanel.loadImage(fileName); //截入图像并显示 } } //模糊图像按钮buttonBlur事件处理 else if(button==this.buttonBlur) { imagePanel.blur(); //模糊图像 buttonReset.setEnabled(true); //设置还原图像按钮可用 } //锐化图像按钮buttonSharpen事件处理 else if(button==this.buttonSharpen) { imagePanel.sharpen(); //锐化图像 buttonReset.setEnabled(true); //设置还原图像按钮可用 } //还原图像按钮buttonBlur事件处理 else if(button==this.buttonReset) { imagePanel.reset(); //还原图像 buttonReset.setEnabled(false); //设置还原图像按钮不可用 } } public static void main(String[] args) { new BlurAndSharpenDemo(); } public class ImagePanel extends JPanel { Image image; //被处理的图像 BufferedImage bufImage; //用于显示的缓冲区图像 BufferedImage originalBufImage; //原始缓冲区图像 Graphics2D g2D; //图形环境 //载入图像 public void loadImage(String fileName) { image = this.getToolkit().getImage(fileName); //获取图像 MediaTracker mt = new MediaTracker(this); //实例化媒体加载器 mt.addImage(image, 0); //增加待加载图像到媒体加载器 try { mt.waitForAll(); //等待所有图像的加载完成 } catch (Exception ex) { ex.printStackTrace(); //输出出错信息 } //创建原始缓冲区图像 originalBufImage = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB); g2D = originalBufImage.createGraphics(); //创建缓冲区图像的图形环境 g2D.drawImage(image, 0, 0, this); //传输源图像数据到缓冲区图像中 bufImage = originalBufImage; repaint(); //重绘组件 } //过滤图像 public void applyFilter(float[] data) { if (bufImage == null) return; //如果bufImage为空则直接返回 Kernel kernel = new Kernel(3, 3, data); ConvolveOp imageOp=new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP, null); //创建卷积变换操作对象 BufferedImage filteredBufImage = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB); //过滤后的缓冲区图像 imageOp.filter(bufImage, filteredBufImage);//过滤图像,目标图像在filteredBufImage bufImage = filteredBufImage; //让用于显示的缓冲区图像指向过滤后的图像 repaint(); //重绘组件 } //模糊图像 public void blur() { if (bufImage == null) return; float[] data = { 0.0625f, 0.125f, 0.0625f, 0.125f, 0.025f, 0.125f, 0.0625f, 0.125f, 0.0625f }; applyFilter(data); } //锐化图像 public void sharpen() { if (bufImage == null) return; float[] data = { -1.0f, -1.0f, -1.0f, -1.0f, 9.0f, -1.0f, -1.0f, -1.0f, -1.0f }; applyFilter(data); } //恢复图像 public void reset() { if (bufImage == null) return; bufImage = originalBufImage; // g2D.drawImage(image, 0, 0, this); repaint(); //调用paint()方法重绘组件 } public void paint(Graphics g) { super.paintComponent(g); //如果bufImage非空,则在组件上绘制它 if (bufImage != null) { Graphics2D g2 = (Graphics2D) g; g2.drawImage(bufImage,(this.getWidth() - bufImage.getWidth()) / 2, (this.getHeight() - bufImage.getHeight()) / 2,this); } } } }