码迷,mamicode.com
首页 > 其他好文 > 详细

做一个具有图片读入,写出,灰度化,黑白化的有图形界面的小软件

时间:2015-10-25 22:14:05      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

  我们这一次的树莓基础的作业是做一个做一个具有图片读入,写出,灰度化,黑白化的小软件,我采用的是java,因为java有大量性能非常好的接口可用,譬如在图片这块,ImageIO,BufferedImage都是非常好用的,而我这一次作业也是使用这两个包。

  首先我们要解决的是界面,界面可以直接用JFrame来打, 非常简单,我的界面有一个菜单栏和一个图片显示区,菜单栏有三个选项:文件,转换,保存,文件菜单有一个子菜单:打开文件,转换菜单有两个子菜单:变成灰度和变成黑白,保存菜单有三个子菜单:jpg, png, bmp.显示区在没有照片的时候显示的是图片显示区五个字。

界面的代码如下:

 1     JLabel jl=new JLabel("图片显示区");
 2     JMenuBar jmb=new JMenuBar();
 3     JMenu jm=new JMenu("文件");
 4     JMenu zh = new JMenu("转换");
 5     JMenu save = new JMenu("保存");
 6     JMenuItem huidu =new JMenuItem("变成灰度");
 7     JMenuItem heibai =new JMenuItem("变成黑白");
 8     JMenuItem jmi=new JMenuItem("选择图片");
 9     JMenuItem jpg =new JMenuItem("jpg");
10     JMenuItem png =new JMenuItem("png");
11     JMenuItem bmp =new JMenuItem("bmp");
12     JPanel jp=new JPanel(new FlowLayout(FlowLayout.CENTER));
13     //文件选择对话框
14     JFileChooser chooser=new JFileChooser();
 1        super("浏览图片");
 2         jmb.add(jm);
 3         jmb.add(zh);
 4         jmb.add(save);
 5         save.add(jpg);
 6         save.add(png);
 7         save.add(bmp);
 8         jm.add(jmi);
 9         zh.add(huidu);
10         zh.add(heibai);
11         jp.add(jl);
12         //为各个菜单项添加监听器
13         heibai.addActionListener(this);
14         huidu.addActionListener(this);
15         jmi.addActionListener(this);
16         jpg.addActionListener(this);
17         png.addActionListener(this);
18         bmp.addActionListener(this);
19         
20         this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
21         this.setLayout(new BorderLayout());
22         this.add(jmb,BorderLayout.NORTH);
23         this.add(jp,BorderLayout.CENTER);
24         this.setSize(500,500);
25         this.setVisible(true);

然后为了保存图片方便,我也创建了一个文件夹

File file = new File("./file");
file.mkdirs();

界面打好之后就是监听,如果监听到时文件选择对话框,就进行打开图片的操作

 1 if (e.getSource() == jmi) {
 2             int i=chooser.showOpenDialog(this);
 3             if(i==chooser.APPROVE_OPTION){
 4                 File file = new File(chooser.getSelectedFile().getPath());   
 5             try {
 6                 //读图
 7                 image = ImageIO.read(file);
 8             } catch (IOException e1) {
 9                 // TODO Auto-generated catch block
10                 e1.printStackTrace();
11             }  
12             grayImage = null;
13             //显示图片
14             jl.setIcon(new ImageIcon(image));
15             jl.setText("");
16             }
17             if(i==chooser.CANCEL_OPTION)return;
18           }

如果监听来源是转成灰度图或者黑白图,则进行以下的操作:

 1         //监听到要转换成灰度图
 2         if (e.getSource() == huidu && image != null) {
 3             //创建一个灰度图
 4             grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY  
 5             //用一个两重循环进行像素点赋值
 6             for(int i= 0 ; i < image.getWidth() ; i++){  
 7                 for(int j = 0 ; j < image.getHeight(); j++){  
 8                     int rgb = image.getRGB(i, j);  
 9                     grayImage.setRGB(i, j, rgb);  
10                 }  
11             }
12             jl.setIcon(new ImageIcon(grayImage));
13             jl.setText("");
14         }
15         //监听到要转换成黑白图
16         if (e.getSource() == heibai && image != null) {
17             //创建一个新的图片
18             grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY  
19             for(int i= 0 ; i < image.getWidth() ; i++){  
20                 for(int j = 0 ; j < image.getHeight(); j++){  
21                     int rgb = image.getRGB(i, j); 
22                     //给新图片设置像素值
23                     grayImage.setRGB(i, j, rgb);  
24                 }  
25             }
26             jl.setIcon(new ImageIcon(grayImage));
27             jl.setText("");
28         }

如果是监听到保存,就进行保存,例如监听到保存成JPG:

 1 //对图片进行保存
 2         //此处要保证image或者grayImage不为null,是因为保存的前提应该是存在图片
 3         if (e.getSource() == jpg && (image != null | grayImage != null)) {
 4             num++;
 5             File newFile = new File("./file/newpicture" + num + ".jpg");  
 6             if (grayImage != null) {
 7                 try {
 8                     ImageIO.write(grayImage, "jpg", newFile);
 9                 } catch (IOException e1) {
10                     // TODO Auto-generated catch block
11                     e1.printStackTrace();
12                 } 
13             } else {
14                 try {
15                     ImageIO.write(image, "jpg", newFile);
16                 } catch (IOException e1) {
17                     // TODO Auto-generated catch block
18                     e1.printStackTrace();
19                 }
20             }
21         }

OK,有了界面,有了监听,然后再加上个主函数去调用,我们的软件就完成了,下面是效果截图:

这个是主界面

技术分享

这是读入一张图片之后的截图

技术分享

灰度化:

技术分享

黑白化:

技术分享

保存之后:

技术分享

 

以下是源代码:

技术分享
  1 /*
  2  * 该程序实现的是一个小小的读图,处理保存图的简单软件
  3  * 可以实现彩图,灰度图等的读入,
  4  * 可以将彩图,灰度图等转化成灰度图或者只有一位的黑白图
  5  * 可以将处理好的,或者没有处理的图片进行保存
  6  * */
  7 
  8 
  9 
 10 
 11 
 12 package shumeijicu2;
 13 
 14 import javax.imageio.ImageIO;
 15 import javax.swing.*;
 16 
 17 import java.awt.event.*;
 18 import java.awt.image.BufferedImage;
 19 import java.awt.*;
 20 import java.io.*;
 21  
 22 public class picture extends JFrame implements ActionListener{
 23     int num = 0;  // 用于保存图片的时候实现排序
 24     BufferedImage image = null;
 25     BufferedImage grayImage = null;
 26     JLabel jl=new JLabel("图片显示区");
 27     JMenuBar jmb=new JMenuBar();
 28     JMenu jm=new JMenu("文件");
 29     JMenu zh = new JMenu("转换");
 30     JMenu save = new JMenu("保存");
 31     JMenuItem huidu =new JMenuItem("变成灰度");
 32     JMenuItem heibai =new JMenuItem("变成黑白");
 33     JMenuItem jmi=new JMenuItem("选择图片");
 34     JMenuItem jpg =new JMenuItem("jpg");
 35     JMenuItem png =new JMenuItem("png");
 36     JMenuItem bmp =new JMenuItem("bmp");
 37     JPanel jp=new JPanel(new FlowLayout(FlowLayout.CENTER));
 38     //文件选择对话框
 39     JFileChooser chooser=new JFileChooser();
 40     
 41     
 42     public picture() {
 43         super("浏览图片");
 44         jmb.add(jm);
 45         jmb.add(zh);
 46         jmb.add(save);
 47         save.add(jpg);
 48         save.add(png);
 49         save.add(bmp);
 50         jm.add(jmi);
 51         zh.add(huidu);
 52         zh.add(heibai);
 53         jp.add(jl);
 54         //为各个菜单项添加监听器
 55         heibai.addActionListener(this);
 56         huidu.addActionListener(this);
 57         jmi.addActionListener(this);
 58         jpg.addActionListener(this);
 59         png.addActionListener(this);
 60         bmp.addActionListener(this);
 61         
 62         this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
 63         this.setLayout(new BorderLayout());
 64         this.add(jmb,BorderLayout.NORTH);
 65         this.add(jp,BorderLayout.CENTER);
 66         this.setSize(500,500);
 67         this.setVisible(true);
 68         //创建一个存放图片的文件夹
 69         File file = new File("./file");
 70         file.mkdirs();
 71         
 72     }
 73     public void actionPerformed(ActionEvent e){
 74         //监听到对象是文件选择对话框
 75         if (e.getSource() == jmi) {
 76             int i=chooser.showOpenDialog(this);
 77             if(i==chooser.APPROVE_OPTION){
 78                 File file = new File(chooser.getSelectedFile().getPath());   
 79             try {
 80                 //读图
 81                 image = ImageIO.read(file);
 82             } catch (IOException e1) {
 83                 // TODO Auto-generated catch block
 84                 e1.printStackTrace();
 85             }  
 86             grayImage = null;
 87             //显示图片
 88             jl.setIcon(new ImageIcon(image));
 89             jl.setText("");
 90             }
 91             if(i==chooser.CANCEL_OPTION)return;
 92           }
 93         //监听到要转换成灰度图
 94         if (e.getSource() == huidu && image != null) {
 95             //创建一个灰度图
 96             grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY  
 97             //用一个两重循环进行像素点赋值
 98             for(int i= 0 ; i < image.getWidth() ; i++){  
 99                 for(int j = 0 ; j < image.getHeight(); j++){  
100                     int rgb = image.getRGB(i, j);  
101                     grayImage.setRGB(i, j, rgb);  
102                 }  
103             }
104             jl.setIcon(new ImageIcon(grayImage));
105             jl.setText("");
106         }
107         //监听到要转换成黑白图
108         if (e.getSource() == heibai && image != null) {
109             //创建一个新的图片
110             grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_BINARY);//重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY  
111             for(int i= 0 ; i < image.getWidth() ; i++){  
112                 for(int j = 0 ; j < image.getHeight(); j++){  
113                     int rgb = image.getRGB(i, j); 
114                     //给新图片设置像素值
115                     grayImage.setRGB(i, j, rgb);  
116                 }  
117             }
118             jl.setIcon(new ImageIcon(grayImage));
119             jl.setText("");
120         }
121         //对图片进行保存
122         //此处要保证image或者grayImage不为null,是因为保存的前提应该是存在图片
123         if (e.getSource() == jpg && (image != null | grayImage != null)) {
124             num++;
125             File newFile = new File("./file/newpicture" + num + ".jpg");  
126             if (grayImage != null) {
127                 try {
128                     ImageIO.write(grayImage, "jpg", newFile);
129                 } catch (IOException e1) {
130                     // TODO Auto-generated catch block
131                     e1.printStackTrace();
132                 } 
133             } else {
134                 try {
135                     ImageIO.write(image, "jpg", newFile);
136                 } catch (IOException e1) {
137                     // TODO Auto-generated catch block
138                     e1.printStackTrace();
139                 }
140             }
141         }
142         if (e.getSource() == png && (image != null | grayImage != null)) {
143             num++;
144             File newFile = new File("./file/newpicture" + num + ".png");  
145             if (grayImage != null) {
146                 try {
147                     ImageIO.write(grayImage, "png", newFile);
148                 } catch (IOException e1) {
149                     // TODO Auto-generated catch block
150                     e1.printStackTrace();
151                 } 
152             } else {
153                 try {
154                     ImageIO.write(image, "png", newFile);
155                 } catch (IOException e1) {
156                     // TODO Auto-generated catch block
157                     e1.printStackTrace();
158                 }
159             }
160         }
161         if (e.getSource() == bmp && (image != null | grayImage != null)) {
162             num++;
163             File newFile = new File("./file/newpicture" + num + ".bmp");  
164             if (grayImage != null) {
165                 try {
166                     ImageIO.write(grayImage, "bmp", newFile);
167                 } catch (IOException e1) {
168                     // TODO Auto-generated catch block
169                     e1.printStackTrace();
170                 } 
171             } else {
172                 try {
173                     ImageIO.write(image, "bmp", newFile);
174                 } catch (IOException e1) {
175                     // TODO Auto-generated catch block
176                     e1.printStackTrace();
177                 }
178             }
179         }
180      }
181     
182     //主函数
183     public static void main (String[] args) {
184     new picture();
185    }
186 }
完整源代码

 

做一个具有图片读入,写出,灰度化,黑白化的有图形界面的小软件

标签:

原文地址:http://www.cnblogs.com/linchw3/p/4909477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!