Java 影象的模糊與銳化
阿新 • • 發佈:2019-02-01
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); } } } }