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 StringfileString = null ;
// 用于显示图像的标签
private JLabelimageLabel = null ;
// 加载的图像
private BufferedImagenewImage;
// 图像的高和宽
private int h,w;
// 保存历史操作图像矩阵
private LinkedList < int [] > imageStack = new LinkedList < int [] > ();
private LinkedList < int [] > tempImageStack = new LinkedList < int [] > ();
public MyShowImage(Stringtitle){
super (title);
this .setSize( 800 , 600 );
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建菜单
JMenuBarjb = new JMenuBar();
JMenufileMenu = new JMenu( " 文件 " );
jb.add(fileMenu);
JMenuItemopenImageMenuItem = new JMenuItem( " 打开图像 " );
fileMenu.add(openImageMenuItem);
openImageMenuItem.addActionListener( new OpenListener());
JMenuItemexitMenu = new JMenuItem( " 退出 " );
fileMenu.add(exitMenu);
exitMenu.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvente){
System.exit( 0 );
}
});
JMenuoperateMenu = new JMenu( " 图像处理 " );
jb.add(operateMenu);
JMenuItemRGBtoGrayMenuItem = new JMenuItem( " 灰度图像转换 " );
operateMenu.add(RGBtoGrayMenuItem);
RGBtoGrayMenuItem.addActionListener( new RGBtoGrayActionListener());
JMenuItembalanceMenuItem = new JMenuItem( " 均衡化 " );
operateMenu.add(balanceMenuItem);
balanceMenuItem.addActionListener( new BalanceActionListener());
JMenufrontAndBackMenu = new JMenu( " 历史操作 " );
jb.add(frontAndBackMenu);
JMenuItembackMenuItem = new JMenuItem( " 后退 " );
frontAndBackMenu.add(backMenuItem);
backMenuItem.addActionListener( new BackActionListener());
JMenuItemfrontMenuItem = new JMenuItem( " 前进 " );
frontAndBackMenu.add(frontMenuItem);
frontMenuItem.addActionListener( new FrontActionListener());
this .setJMenuBar(jb);
imageLabel = new JLabel( "" );
JScrollPanepane = new JScrollPane(imageLabel);
this .add(pane,BorderLayout.CENTER);
this .setVisible( true );
}
private class OpenListener implements ActionListener{
public void actionPerformed(ActionEvente){
JFileChooserjc = new JFileChooser();
int returnValue = jc.showOpenDialog( null );
if (returnValue == JFileChooser.APPROVE_OPTION){
FileselectedFile = 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 (IOExceptionex){
System.out.println(ex);
}
}
}
MyShowImage. this .repaint();
// MyShowImage.this.pack();
}
}
// 菜单监听器///
private class RGBtoGrayActionListener implements ActionListener{
public void actionPerformed(ActionEvente){
int []resultArray = RGBtoGray(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BalanceActionListener implements ActionListener{
public void actionPerformed(ActionEvente){
int []resultArray = balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BackActionListener implements ActionListener{
public void actionPerformed(ActionEvente){
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(ActionEvente){
if (tempImageStack.size() < 1 ){
JOptionPane.showMessageDialog( null , " 此幅图片的处理已经没有前进历史操作了 " , " 提示 " ,
JOptionPane.INFORMATION_MESSAGE);
} else {
currentPixArray = tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
}
}
}
// 获取图像像素矩阵/
private int []getPixArray(Imageim, int w, int h){
int []pix = new int [w * h];
PixelGrabberpg = null ;
try {
pg = new PixelGrabber(im, 0 , 0 ,w,h,pix, 0 ,w);
if (pg.grabPixels() != true )
try {
throw new java.awt.AWTException( " pgerror " + pg.status());
} catch (Exceptioneq){
eq.printStackTrace();
}
} catch (Exceptionex){
ex.printStackTrace();
}
return pix;
}
// 显示图片///
private void showImage( int []srcPixArray){
Imagepic = createImage( new MemoryImageSource(w,h,srcPixArray, 0 ,w));
ImageIconic = new ImageIcon(pic);
imageLabel.setIcon(ic);
imageLabel.repaint();
}
// 灰度转换///
private int []RGBtoGray( int []ImageSource){
int []grayArray = new int [h * w];
ColorModelcolorModel = 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 " );
}
}
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 StringfileString = null ;
// 用于显示图像的标签
private JLabelimageLabel = null ;
// 加载的图像
private BufferedImagenewImage;
// 图像的高和宽
private int h,w;
// 保存历史操作图像矩阵
private LinkedList < int [] > imageStack = new LinkedList < int [] > ();
private LinkedList < int [] > tempImageStack = new LinkedList < int [] > ();
public MyShowImage(Stringtitle){
super (title);
this .setSize( 800 , 600 );
this .setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建菜单
JMenuBarjb = new JMenuBar();
JMenufileMenu = new JMenu( " 文件 " );
jb.add(fileMenu);
JMenuItemopenImageMenuItem = new JMenuItem( " 打开图像 " );
fileMenu.add(openImageMenuItem);
openImageMenuItem.addActionListener( new OpenListener());
JMenuItemexitMenu = new JMenuItem( " 退出 " );
fileMenu.add(exitMenu);
exitMenu.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvente){
System.exit( 0 );
}
});
JMenuoperateMenu = new JMenu( " 图像处理 " );
jb.add(operateMenu);
JMenuItemRGBtoGrayMenuItem = new JMenuItem( " 灰度图像转换 " );
operateMenu.add(RGBtoGrayMenuItem);
RGBtoGrayMenuItem.addActionListener( new RGBtoGrayActionListener());
JMenuItembalanceMenuItem = new JMenuItem( " 均衡化 " );
operateMenu.add(balanceMenuItem);
balanceMenuItem.addActionListener( new BalanceActionListener());
JMenufrontAndBackMenu = new JMenu( " 历史操作 " );
jb.add(frontAndBackMenu);
JMenuItembackMenuItem = new JMenuItem( " 后退 " );
frontAndBackMenu.add(backMenuItem);
backMenuItem.addActionListener( new BackActionListener());
JMenuItemfrontMenuItem = new JMenuItem( " 前进 " );
frontAndBackMenu.add(frontMenuItem);
frontMenuItem.addActionListener( new FrontActionListener());
this .setJMenuBar(jb);
imageLabel = new JLabel( "" );
JScrollPanepane = new JScrollPane(imageLabel);
this .add(pane,BorderLayout.CENTER);
this .setVisible( true );
}
private class OpenListener implements ActionListener{
public void actionPerformed(ActionEvente){
JFileChooserjc = new JFileChooser();
int returnValue = jc.showOpenDialog( null );
if (returnValue == JFileChooser.APPROVE_OPTION){
FileselectedFile = 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 (IOExceptionex){
System.out.println(ex);
}
}
}
MyShowImage. this .repaint();
// MyShowImage.this.pack();
}
}
// 菜单监听器///
private class RGBtoGrayActionListener implements ActionListener{
public void actionPerformed(ActionEvente){
int []resultArray = RGBtoGray(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BalanceActionListener implements ActionListener{
public void actionPerformed(ActionEvente){
int []resultArray = balance(currentPixArray);
imageStack.addLast(resultArray);
currentPixArray = resultArray;
showImage(resultArray);
tempImageStack.clear();
}
}
private class BackActionListener implements ActionListener{
public void actionPerformed(ActionEvente){
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(ActionEvente){
if (tempImageStack.size() < 1 ){
JOptionPane.showMessageDialog( null , " 此幅图片的处理已经没有前进历史操作了 " , " 提示 " ,
JOptionPane.INFORMATION_MESSAGE);
} else {
currentPixArray = tempImageStack.removeFirst();
imageStack.addLast(currentPixArray);
showImage(currentPixArray);
}
}
}
// 获取图像像素矩阵/
private int []getPixArray(Imageim, int w, int h){
int []pix = new int [w * h];
PixelGrabberpg = null ;
try {
pg = new PixelGrabber(im, 0 , 0 ,w,h,pix, 0 ,w);
if (pg.grabPixels() != true )
try {
throw new java.awt.AWTException( " pgerror " + pg.status());
} catch (Exceptioneq){
eq.printStackTrace();
}
} catch (Exceptionex){
ex.printStackTrace();
}
return pix;
}
// 显示图片///
private void showImage( int []srcPixArray){
Imagepic = createImage( new MemoryImageSource(w,h,srcPixArray, 0 ,w));
ImageIconic = new ImageIcon(pic);
imageLabel.setIcon(ic);
imageLabel.repaint();
}
// 灰度转换///
private int []RGBtoGray( int []ImageSource){
int []grayArray = new int [h * w];
ColorModelcolorModel = 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