hello_wangfeng 发表于 2013-2-3 11:27:05

实现水平方向重采样的java图像处理程序

该程序主要实现水平方向上的灰度图像重采样。重采样通过3个for循环控制完成。原始lena图如下所示:
http://dl.iteye.com/upload/attachment/0076/1255/47050dcc-e581-31f1-8955-35c39524db0b.jpg


水平方向每8个点采集一个点的lena图像如下所示:
http://dl.iteye.com/upload/attachment/0076/1257/339f119c-c459-3137-84be-b2b284591a44.jpg

package p01;import java.awt.*;import java.awt.event.*;import java.awt.image.*;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.*;public class chongcaiyang extends Frame{Image im, tmp;int iw, ih;int[] pixels;boolean flag_load = false;//构造方法public chongcaiyang(){super("chongcaiyang");Panel pdown;    Button load, run, save, quit;   addWindowListener(new WindowAdapter(){    public void windowClosing(WindowEvent e){    System.exit(0);    }    });      pdown = new Panel();    pdown.setBackground(Color.lightGray);    //定义按钮    load = new Button("装载图像");      run = new Button("重采样");    save = new Button("保存");    quit = new Button("退出");      this.add(pdown, BorderLayout.SOUTH);    //添加按钮 此处的顺序为案板上的左->右的顺序    pdown.add(load);      pdown.add(run);    pdown.add(save);    pdown.add(quit);      //按钮的动作程序装载图像    load.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){    try {jLoad_ActionPerformed(e);} catch (IOException e1) {e1.printStackTrace();}    }    });    //按钮的动作程序重采样    run.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){    try {jRun_ActionPerformed(e);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}    }    });    //按钮的动作程序 保存    save.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){    try {jSave_ActionPerformed(e);} catch (IOException e1) {e1.printStackTrace();}    }    });    //按钮的动作程序退出    quit.addActionListener(new ActionListener(){      public void actionPerformed(ActionEvent e){    jQuit_ActionPerformed(e);    }    });}//按钮动作的实现加载图像    public void jLoad_ActionPerformed(ActionEvent e) throws IOException{      File inputFile = new File("E:\\f2\\sc\\lena_grey.jpg");      BufferedImage input = ImageIO.read(inputFile);tmp = input;      flag_load = true;      repaint();}//按钮动作的实现重采样public void jRun_ActionPerformed(ActionEvent e) throws IOException{      if(flag_load){File inputFile = new File("E:\\f2\\sc\\lena_grey.jpg");          BufferedImage input = ImageIO.read(inputFile);          iw = input.getWidth(this);          ih = input.getHeight(this);   //设定N值int N = iw;String s = JOptionPane.showInputDialog(null,"请输入N值(512/256/128/64/32/16/8)");if(s!= null&& !s.equals("")){N = Integer.parseInt(s);}//检查输入是否正确if((N>512)|(N<8)){N = 512;JOptionPane.showMessageDialog(null, "输入不正确,请重新输入!");}               //图像重采样BufferedImage grayImage = new BufferedImage(iw, ih, BufferedImage.TYPE_BYTE_GRAY);//kao!三个循环就就能搞定,不就是重采样吗?for(int i=0; i<ih-1; i++){for(int j=0; j<iw-1; j=j+(ih/N)){for(int k=0; k<(ih/N); k++){int rgb = input.getRGB(i, j);    int grey = (int) (0.3*((rgb&0xff0000)>>16)+0.59*((rgb&0xff00)>>8)+0.11*((rgb&0xff)));rgb = 255<<24|grey<<16|grey<<8|grey;grayImage.setRGB(i, j+k, rgb);}}}                //产生图像tmp = grayImage;flag_load = true;repaint();}else{JOptionPane.showMessageDialog(null, "先点击“装载图像”,3Q!","提示:",          JOptionPane.WARNING_MESSAGE);}}//按钮动作的实现保存   public void jSave_ActionPerformed(ActionEvent e) throws IOException{            if(flag_load){            BufferedImage bi = new BufferedImage(tmp.getWidth(null),tmp.getHeight(null),   BufferedImage.TYPE_INT_RGB);            Graphics g = bi.getGraphics();            g.drawImage(tmp,0, 0,null);            g.dispose();          File save_path=new File("E:\\f2\\sc\\save_t01.jpg");            ImageIO.write(bi, "JPG", save_path);}else{JOptionPane.showMessageDialog(null, "先点击“装载图像”,3Q!","提示:",JOptionPane.WARNING_MESSAGE);}}//按钮动作的实现退出public void jQuit_ActionPerformed(ActionEvent e){System.exit(0);}//绘图函数public void paint(Graphics g){//if(flag_Load){g.drawImage(tmp,50,50,this);//}else{}}public static void main(String[] args) {chongcaiyang ti = new chongcaiyang();ti.setSize(1000,860);ti.setVisible(true);}}
页: [1]
查看完整版本: 实现水平方向重采样的java图像处理程序