簡單的Java影像處理程式__Java
來源:互聯網
上載者:User
import java.awt.BorderLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.MemoryImageSource;
import java.awt.image.PixelGrabber;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
public class MyShowImage extends JFrame {
// 儲存當前操作的像素矩陣
private int currentPixArray[] = null ;
// 映像的路徑
private String fileString = null ;
// 用於顯示映像的標籤
private JLabel imageLabel = null ;
// 載入的映像
private BufferedImage newImage;
// 映像的高和寬
private int h,w;
// 儲存曆史操作映像矩陣
private LinkedList < int [] > imageStack = new LinkedList < int [] > ();
private LinkedList < int [] > tempImageStack = new LinkedList < int [] > ();
public MyShowImage(String title){
super (title);
this .setSize( 800 , 600 );
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 建立菜單
JMenuBar jb = new JMenuBar();
JMenu fileMenu = new JMenu( " 檔案 " );
jb.add(fileMenu);
JMenuItem openImageMenuItem = new JMenuItem( " 開啟映像 " );
fileMenu.add(openImageMenuItem);
openImageMenuItem.addActionListener( new OpenListener());
JMenuItem exitMenu = new JMenuItem( " 退出 " );
fileMenu.add(exitMenu);
exitMenu.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit( 0 );
}
});
JMenu operateMenu = new JMenu( " 影像處理 " );
jb.add(operateMenu);
JMenuItem RGBtoGrayMenuItem = new JMenuItem( " 灰階映像轉換 " );
operateMenu.add(RGBtoGrayMenuItem);
RGBtoGrayMenuItem.addActionListener( new RGBtoGrayActionListener());
JMenuItem balanceMenuItem = new JMenuItem( " 均衡化 " );
operateMenu.add(balanceMenuItem);
balanceMenuItem.addActionListener( new BalanceActionListener());
JMenu frontAndBackMenu = new JMenu( " 曆史操作 " );
jb.add(frontAndBackMenu);
JMenuItem backMenuItem = new JMenuItem( " 後退 " );
frontAndBackMenu.add(backMenuItem);
backMenuItem.addActionListener( new BackActionListener());
JMenuItem frontMenuItem = new JMenuItem( " 前進 " );
frontAndBackMenu.add(frontMenuItem);
frontMenuItem.addActionListener( new FrontActionListener());
this .setJMenuBar(jb);
imageLabel = new JLabel( "" );
JScrollPane pane = new JScrollPane(imageLabel);
this .add(pane,BorderLayout.CENTER);
this .setVisible( true );
}
private class OpenListener implements ActionListener{
public void actionPerformed(ActionEvent e){
JFileChooser jc = new JFileChooser();
int returnValue = jc.showOpenDialog( null );
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jc.getSelectedFile();
if (selectedFile != null ) {
fileString = selectedFile.getAbsolutePath();
try {
newImage = ImageIO.read( new File(fileString));
w = newImage.getWidth();
h = newImage.getHeight();
currentPixArray = getPixArray(newImage,w,h);
imageStack.clear();
tempImageStack.clear();
imageStack.addLast(currentPixArray);
imageLabel.setIcon( new ImageIcon(newImage));
} catch (IOException ex){
System.out.println(ex);
}
}
}
MyShowImage. this .repaint();
// MyShowImage.this.pack();
}
}
////////////////// 菜單監聽器///////////
private class RGBtoGrayActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int [] resultArray = RGBtoGray(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BalanceActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int [] resultArray = balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BackActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if (imageStack.size() <= 1 ){
JOptionPane.showMessageDialog( null , " 此幅圖片的處理已經沒有後退曆史操作了 " , " 提示 " ,
JOptionPane.INFORMATION_MESSAGE);
} else {
tempImageStack.addLast(imageStack.removeLast());
currentPixArray = imageStack.getLast();
showImage(currentPixArray);
}
}
}
private class FrontActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
if (tempImageStack.size() < 1 ){
JOptionPane.showMessageDialog( null , " 此幅圖片的處理已經沒有前進曆史操作了 " , " 提示 " ,
JOptionPane.INFORMATION_MESSAGE);
} else {
currentPixArray = tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
}
}
}
////////////////// 擷取映像像素矩陣/////////
private int []getPixArray(Image im, int w, int h){
int [] pix = new int [w * h];
PixelGrabber pg = null ;
try {
pg = new PixelGrabber(im, 0 , 0 , w, h, pix, 0 , w);
if (pg.grabPixels() != true )
try {
throw new java.awt.AWTException( " pg error " + pg.status());
} catch (Exception eq){
eq.printStackTrace();
}
} catch (Exception ex){
ex.printStackTrace();
}
return pix;
}
////////////////// 顯示圖片///////////
private void showImage( int [] srcPixArray){
Image pic = createImage( new MemoryImageSource(w,h,srcPixArray, 0