您的位置:首页 > 编程语言 > Java开发

简单的Java图像处理程序

2008-03-20 09:04 555 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: