zoukankan      html  css  js  c++  java
  • 简单的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
  • 相关阅读:
    UVA 11997 K个最小和
    UVALive 3135阿格斯
    UVA 10635 王子和公主
    UVA11991线性查询
    UVA1339仿射和换位密码
    UVA 10382喷水设施
    LA2965字符串合并
    FatMouse's Speed--hdu1160(dp+输出路径)
    Dividing--hdu1059(动态规划)
    Piggy-Bank--hdu1114(完全背包)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470447.html
Copyright © 2011-2022 走看看