简单的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, 00, 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

posted on 2008-03-20 09:04  岚之山  阅读(363)  评论(0编辑  收藏  举报

导航