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

我们这一次的树莓基础的作业是做一个做一个具有图片读入,写出,灰度化,黑白化的小软件,我采用的是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 }

完整源代码

时间: 2024-08-02 06:58:57

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

用struts2做一个带有图片效果的登陆验证码

我们在登陆网站的时候总是会有带有图片验证功能的验证码,它是怎么做出来的了,今天我就详细的将每一步步骤写出来. 1.在action层 1 package cn.itcast.javaee.js.checkcode; 2 3 import java.io.PrintWriter; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts2.ServletActionContext; 6 import com

python3 文件读入写出小结

Python3 各种文件格式的转换: 1 import json 2 import pymysql 3 from datetime import datetime 4 from xlrd import xldate_as_tuple 5 import xlrd 6 import xlwt 7 8 9 # 读CSV 10 def readCSV(): 11 ls = [] 12 with open('../ls/textfile/price2016.csv', 'r', encoding='utf

怎么使用response.write来做一个javascript的alert弹出窗口

Page.RegisterStartupScript("alert", "<script language=javascript>alert('添加成功');</script>");_____________________________________________________________________ response.write("<script language='javascript'>windo

如何写出优雅的CSS代码 ?(转)

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代

【知识点】如何写出优雅的CSS代码 ?

对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如何写出优雅的css代

如何写出优雅的css代码?

如何写出优雅的css代码? 对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来井井有条,清晰易懂,这样的代码有利于团队合作和后期的维护:而有的混乱,虽然表达出了最终的效果,然而却晦涩难懂,显然团队成员在读这样的代码时就显得无从下手,更不利于后期的维护了.那么如何写出优雅的代码呢?下面我将以一个很小的项目就以下几个方面简单的表达一下自己的看法,如有不妥,望批评指正. 如何整理一个项目. 如何写出清晰易懂的HTML代码. 如

写出优美代码的方式,两个习惯:一步到位VS迭代优化

最近把手头这个安卓APP的所有事务性方法都写完了,有了以下体会,新手体会,老鸟轻拍 想写成优美代码的人一般都会有这样的想法: 一定要在写每一句代码,写每一个方法,构造每一个类的时候,都要记得优化:解耦以复用,拆分方法以复用,使用循环减少冗余,限制循环次数减少无效操作,等等.. 这个想法一定没有错,但很多时候往往会是这样的情况: 当功能一复杂,比如你已经分解了几个方法,比如你已经使用了几层循环(有点过分...),比如在多线程中 你经常无法一步到位地完成那么多优化 这往往造成你写一句代码会思考很久

个人站长的疑问:怎么样才能做一个能赚钱的网站?

老牛也是个业余爱好,只是比大家接触时间长,和真正互联网行业里的人来说,我们都是小巫!!所以别抱有什么幻想,自己能成为马云.李彦宏.马化腾了. 以下这个问题,具有代表性,很多非互联网行业的人其实对这行很有兴趣,其实也不是想大干一番,再搞个BAT出来,都有自己工作,只是兴趣,也想接触下这个行业,能挣到一点儿零用钱就能让这类朋友满足了. 有个网友在知乎上给我提问: 您好,我看了您关于google adsense的回答,很牛!在这先赞一个,我对这个也比较感兴趣,想做个站,但不知道从哪入手我给他的回复如下

程序员面试京东前端,现场JavaScript代码写出魔方特效

程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆就直接用JavaScript写了一个魔方特效,最终通过了面试,试用期12K,转正20K的工资水平,这特效看的小编也服气,主要是脑洞大,所以我也COPY了一份源码,分享给头条上的小伙伴学习. 完成之后的效果图如图所示: 完整源码分享给大家: 想要更多项目源码拿来练练手的可以复制下方群号→ web前端/