簡單的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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.