简单的Java图像处理程序

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 ,w));
       ImageIcon ic
= new  ImageIcon(pic);
       imageLabel.setIcon(ic);
       imageLabel.repaint();
}


    
////////////////// 灰度转换///////////
private   int [] RGBtoGray( int [] ImageSource){
    
int []grayArray = new   int [h * w];
    ColorModel colorModel
= ColorModel.getRGBdefault();
    
int  i ,j,k,r,g,b;
    
for (i  =   0 ; i  <  h;i ++ ){
     
for (j  =   0 ;j  <  w;j ++ ){
      k 
=  i * w + j;  
      r 
=  colorModel.getRed(ImageSource[k]);
      g 
=  colorModel.getGreen(ImageSource[k]);
      b 
=  colorModel.getBlue(ImageSource[k]);
      
int  gray = ( int )(r * 0.3 + g * 0.59 + b * 0.11 );
      r
= g = b = gray;
      grayArray[i
* w + j] = ( 255   <<   24 |  (r  <<   16 |  (g  <<   8  ) |  b;
     }
    }
    
return  grayArray;
}


//////////////// /图像均衡化///////////
private   int [] balance( int [] srcPixArray){
      
int [] histogram = new   int [ 256 ];
      
int [] dinPixArray = new   int [w * h];
        
      
for ( int  i = 0 ;i < h;i ++ ){
       
for ( int  j = 0 ;j < w;j ++ ){
        
int  grey = srcPixArray[i * w + j] & 0xff ;
        histogram[grey]
++ ;
       }
      }
      
double  a = ( double ) 255 / (w * h);
      
double [] c = new   double [ 256 ];
      c[
0 ] = (a * histogram[ 0 ]);
      
for ( int  i = 1 ;i < 256 ;i ++ ){
       c[i]
= c[i - 1 ] + ( int )(a * histogram[i]);
      }
      
for ( int  i = 0 ;i < h;i ++ ){
       
for ( int  j = 0 ;j < w;j ++ ){
        
int  grey = srcPixArray[i * w + j] & 0x0000ff ;
        
int  hist = ( int )c[grey];
      
        dinPixArray[i
* w + j] = 255 << 24 | hist << 16 | hist << 8 | hist;
       }
      }
      
return  dinPixArray;
}




public   static   void  main(String[] args) {
    
new  MyShowImage( " ShowImage " );
}

}



#程序暂时只提供图像的灰度转换和直方图的均衡化,有很多地方还需要

完善

#程序能够处理多种格式的图像,如bmp、jpg、jpeg、gif等

转自:http://hi.baidu.com/xianle/blog/item/6366a3ec30429d2463d09f6b.html

你可能感兴趣的:(java,String,null,Class,import,图像处理)