1. 程式人生 > >Java 影象的模糊與銳化

Java 影象的模糊與銳化

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);
			}
		}
	}
}