-
美颜相机开发需求:
- 实现图片的颜色修改
- 实现给图片添加10种滤镜效果
- 实现原图与生成效果的对比
- 实现操作的撤回
- 实现图片的保存为图片文件
- 修改图片的宽高
- 旋转图片的方向
开发步骤:
- 创建一个窗体
- 增加两个按钮
- 实现点击按钮 在窗体内显示对应效果的图片
-
项目代码结构:
- 界面类 ImageProUI
- showUI的方法 用于开发界面
- 主函数 用于启动程序 调用showUI方法
- 监听器类: ImageAction
- 实现ActionListener
- 重写监听器的方法 改分号大括号
- 在方法中 获取按钮的文本 用于区分
-
图片处理的方法 :
- 读取本地图片文件 为一个像素矩阵
- 绘制图片的方法
- Graphics : 图形类-画笔
- 根据我们给定的坐标数据,将对应位置的像素的颜色改为需要的颜色获取: 从窗体对象上获取 Graphics g = jf.getGraphics();
- 必须在可视化之后获取
- 需要在点击按钮之后使用 - 监听器中
-
图片:
- 参数: 尺寸 宽 高
- 像素:
- 就是屏幕的一个小方块
- 每个方块中有3个小的光源
- 每个光源有256阶变化 0-255,三个光源组合有256^3 1677万变化
- 通过数字表示颜色的方式: R G B
- 0 0 0: 黑色
- 255 255 255: 白色
- 255 0 0: 红色
- 0 255 0 : 绿色
- 0 0 255 蓝色
- 一张图片,可以有宽*高个int表示
- 存储二维矩阵:
- BufferedImage 类创建: BufferedImage img = new BufferedImage(300,300,2);
- 填充颜色: img.setRGB(x,y,像素整数);
- 绘制图片: g2.drawImage(img,x,y,null);
- 获取像素: 修改像素值 再绘制
-
获取图片的像素矩阵:
- File 找到图片的路径
- ImageIO 支持图片的读取
- ImageIO.read() 可以将图片的像素存入一个BufferedImage中 用于后续操作
-
package meiyanxiangji; import java.awt.*; import javax.swing.*; public class ImageProUI { public void showUI(){ JFrame jf=new JFrame(); jf.setTitle("美颜相机 v1.0"); jf.setSize(800,700); jf.setDefaultCloseOperation(3); jf.setLocationRelativeTo(null); jf.setLayout(new FlowLayout()); JButton btn1=new JButton("原图"); JButton btn2=new JButton("马赛克"); jf.add(btn1); jf.add(btn2); jf.setVisible(true); ImageAction ial=new ImageAction(); btn1.addActionListener(ial); btn2.addActionListener(ial); Graphics g=jf.getGraphics(); ial.g2=g; } public static void main(String[] args) { ImageProUI ui=new ImageProUI(); ui.showUI(); } }
package meiyanxiangji; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import java.io.File; import java.io.IOException; public class ImageAction implements ActionListener { Graphics g2; BufferedImage img; { System.out.println("加载图片:"); getImaImagePixels(); } public void actionPerformed(ActionEvent e){ String btnText=e.getActionCommand(); System.out.println("点击了按钮"+btnText); if(btnText.equals("原图")){ drawImage(); }else if (btnText.equals("马赛克")){ drawMosaicImage(); } } public void getImaImagePixels(){ String path="C:\\Users\\Administrator\\Desktop\\于俊龙.jpg"; File file=new File(path); try{ img=ImageIO.read(file); }catch (IOException e){ throw new RuntimeException(e); } } public void drawImage(){ g2.drawImage(img,100,100,null); } public void drawMosaicImage(){ BufferedImage img=new BufferedImage(300,300,2); for(int i=0;i<300;i++){ for (int j=0;j<300;j++){ img.setRGB(i,j,1900000*i*j); } } for (int i=0;i<300;i++){ for(int j=0;j<300;j++){ int num=img.getRGB(i,j); Color color=new Color(num); g2.setColor(color); g2.fillRect(i*10,j*10,10,10); } } } }