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