## 美颜相机

实现美颜相机,我们一共需要三个类

1、UI界面类

2、事件监听器

3、封装方法,直接调用的类

1、UI界面类ImageUI

如果我们一个一个加上按钮会进行大量的复制粘贴工作,所以我们用循环遍历写一个方法直接调用

public void addButton() {String[] btnstrs= {"原图","马赛克","底片","灰度","轮廓提取","美白","油画","温暖","梦幻","二值化","撤回"};for(int i=0;i<btnstrs.length;i++) {String btnstr=btnstrs[i];JButton btn =new JButton(btnstr);add(btn);btn.addActionListener(imglisten);}

写界面初始化的方法,创立一些基本属性

public void initUI() {setTitle("图像处理");setSize(800,800);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);//布局FlowLayout flow=new FlowLayout();setLayout(flow);//调用加上按钮的方法addButton();setVisible(true);//从监听器上获取画笔
imglisten.g=getGraphics();
}

JFrame中自带的paint方法会让窗体在改变时自动重绘,导致我们图片的丢失,所以这里重写一下paint方法,让每次重绘的时候图片也重绘

public void paint(Graphics g) {super.paint(g);for(int i=0;i<imglisten.bfimgSize;i++) {System.out.println("刷新"+i);BufferedImage buffimg=imglisten.buffimgList[i];g.drawImage(buffimg,100,100,null);}}
2、事件监听器类ImageListener

不要忘记在UI类中加上事件监听器类

ImageListener imglisten=new ImageListener();

在事件监听器中,我们需要实现ActionListener接口,声明画笔与封装方法类,需要使用的储存像素的数组,写一些方法去调用

public class ImageListener implements ActionListener{//需要调用封装方法类的许多方法//声明区:Graphics g=null;ImageEff imgeff=new ImageEff();int[][] imgarr;public ImageListener() {String ImagPath01="C:\\Users\\86158\\Desktop\\微信图片_20220123111425.jpg";//   String ImagPath02=" ";imgarr=imgeff.getImagePixArray(ImagPath01);}{System.out.println("daimakuai");}//声明一下存图片的数组BufferedImage[] buffimgList=new BufferedImage[200];int bfimgSize=0;

下面是实现接口中的方法,复制过来,并写上方法体

(其中的img是之后封装方法类里面的返回值,为了在改变窗体时图片不丢失,也为了撤回按键的实现,把返回值存入一个数组,不丢失)

public void actionPerformed(ActionEvent e) {String btnstr=e.getActionCommand();System.out.println("点击了"+btnstr);if(btnstr.equals("原图")) {BufferedImage img=imgeff.drawImage_01(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("马赛克")) {BufferedImage img=imgeff.drawImage_02(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("底片")) {BufferedImage img=imgeff.drawImage_03(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("灰度")) {BufferedImage img=imgeff.drawImage_04(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("轮廓提取")) {BufferedImage img=imgeff.drawImage_05(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("美白")) {BufferedImage img=imgeff.drawImage_06(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("油画")) {BufferedImage img=imgeff.drawImage_07(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("温暖")) {BufferedImage img=imgeff.drawImage_08(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("梦幻")) {BufferedImage img=imgeff.drawImage_09(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("二值化")) {BufferedImage img=imgeff.drawImage_10(imgarr,g); buffimgList[bfimgSize]=img;bfimgSize++;}else if(btnstr.equals("撤回")) {for(int i=0;i<bfimgSize-1;i++) {System.out.println("刷新"+i);BufferedImage buffimg=buffimgList[i];g.drawImage(buffimg, 100, 100, null);}}}
3、封装方法类 ImageEff

创建一个缓冲图片,把缓冲图片的每个像素点的颜色遍历,读取到一个二维数组,并返回,下面的处理方法需要使用

public int[][] getImagePixArray(String path){File file=new File(path);BufferedImage buffimg=null;try {buffimg=ImageIO.read(file);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}int w=buffimg.getWidth();int h=buffimg.getHeight();int[][] imgarr=new int[w][h];for(int i=0;i<w;i++) {for(int j=0;j<h;j++) {imgarr[i][j]=buffimg.getRGB(i, j);}}return imgarr;}

为了解决一个一个画像素点,绘图速度慢的问题,我们调用drawImage方法,直接把img相关属性写好,一次画一张缓冲图片

下面是一些滤镜实现的算法

 //原图public BufferedImage drawImage_01(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];img.setRGB(i, j, rgb);/* Color color=new Color(rgb);g.setColor(color);g.fillRect(100+i, 100+j, 1, 1);*/}}g.drawImage(img, 100, 100,null);return img;}//马赛克public BufferedImage drawImage_02(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i+=10) {for(int j=0;j<imgarr[0].length;j+=10) {int rgb=imgarr[i][j];img.setRGB(i, j, rgb);Color color=new Color(rgb);g.setColor(color);g.fillRect(100+i, 100+j, 10, 10);}}return img;}//底片public BufferedImage drawImage_03(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue =color.getBlue();Color ncolor=new Color(255-red,255-green,255-blue);int n=ncolor.getRGB();/* Color color=new Color(rgb);g.setColor(color);g.fillRect(100+i, 100+j, 1, 1);*/img.setRGB(i, j, n);}}g.drawImage(img, 100, 100,null);return img;}//灰度public BufferedImage drawImage_04(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue =color.getBlue();int grey=(red+blue+green)/3;Color ncolor=new Color(grey,grey,grey);int n=ncolor.getRGB();/*   g.setColor(color);g.fillRect(100+i, 100+j, 1, 1);*/img.setRGB(i, j, n);}}g.drawImage(img, 100, 100,null);return img;}//轮廓提取public BufferedImage drawImage_05(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length-2;i++) {for(int j=0;j<imgarr[0].length-2;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue =color.getBlue();int grey=(red+blue+green)/3;int nrgb=imgarr[i+2][j+2];Color ncolor=new Color(nrgb);int nred=ncolor.getRed();int ngreen=ncolor.getGreen();int nblue =ncolor.getBlue();int ngrey=(nred+nblue+ngreen)/3;if(Math.abs(grey-ngrey)>15) {Color B=new Color(0,0,0);int n=B.getRGB();img.setRGB(i, j, n);}else {Color B=new Color(225,225,225);int n=B.getRGB();img.setRGB(i, j, n);}}}g.drawImage(img, 100, 100,null);return img;}//美白public BufferedImage drawImage_06(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue =color.getBlue();int grey=(red+blue+green)/3;int nred=red>220?250:red+30;int nblue=blue>220?250:blue+30;int ngreen=green>220?250:green+30;Color ncolor=new Color(nred,ngreen,nblue);if(grey<100) {int n=color.getRGB();img.setRGB(i, j, n);}else {int n=ncolor.getRGB();img.setRGB(i, j, n);}}}g.drawImage(img, 100, 100,null);return img;}//油画?(不知道怎么setRGB这一步,所以油画返回的img是什么?应该也没有问题)public BufferedImage drawImage_07(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i+=5) {for(int j=0;j<imgarr[0].length;j+=5) {int rgb=imgarr[i][j];Color color=new Color(rgb);Random random=new Random();int ran=random.nextInt(20)+5;g.setColor(color);g.fillOval(100+i, 100+j, ran, ran);}}return img;}//温暖
public BufferedImage drawImage_08(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue=color.getBlue();Color warmness=new Color(red,green,blue/3);int warm=warmness.getRGB();img.setRGB(i, j, warm);}}g.drawImage(img, 100, 100,null);return img;}//梦幻
public BufferedImage drawImage_09(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue=color.getBlue();Color warmness=new Color(red,green*2/3,blue);int warm=warmness.getRGB();img.setRGB(i, j, warm);}}g.drawImage(img, 100, 100,null);return img;}//整理到此处!!!二值化public BufferedImage drawImage_10(int[][]imgarr,Graphics g) {BufferedImage img=new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[0].length;j++) {int rgb=imgarr[i][j];Color color=new Color(rgb);int red=color.getRed();int green=color.getGreen();int blue =color.getBlue();int grey=(red+blue+green)/3;if(grey<125) {Color B=new Color(0,0,0);int n=B.getRGB();img.setRGB(i, j, n);}else {Color B=new Color(255,255,255);int n=B.getRGB();img.setRGB(i, j, n);}}}g.drawImage(img, 100, 100,null);return img;}}

美颜相机-图片处理(迅速画出+多种滤镜)相关推荐

  1. python plot画图_1. 用Python画出漂亮的图表

    Python 非常简单而又非常强大,它的功能之一就是画出漂亮的图表,实现数据的可视化.在 Matplotlib 帮助下,它能画出多种图表.下面是 Matplotlib 的部分例子. 怎么样?很强大吧! ...

  2. python 漂亮的图表_1. 用Python画出漂亮的图表

    Python 非常简单而又非常强大,它的功能之一就是画出漂亮的图表,实现数据的可视化.在 Matplotlib 帮助下,它能画出多种图表.下面是 Matplotlib 的部分例子. 怎么样?很强大吧! ...

  3. php图片美颜,Mac_Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片,  我们经常会使用美颜相机 - phpStudy...

    Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片 我们经常会使用美颜相机等拍摄一些好玩好看的相片,在MAC系统中也有一个小工具可以帮我们实现这个想法哦,那就是Photo Booth,我们 ...

  4. JAVA美颜相机入门(兼具图像处理和画图板功能)

    美颜相机已经成为当代年轻人不可或缺的自拍神器,其具有自动美肌,完美保留细节,让照片告别模糊等功能.或许我们会觉得编写这样一个具有如此强大功能的美颜相机一定需要庞大而且复杂的代码段,其实不然,即使对于初 ...

  5. 用python画漂亮图片-使用 Python/matplotlib 画出漂亮的论文插图

    论文中画出各种绚烂的插图,都是用一些什么样的软件画出来的.本文介绍 Python 的绘图模块 matplotlib: Python plotting.适用于从 2D 到 3D,从标量到矢量的各种绘图. ...

  6. 图片处理——基于openCV实现美颜相机

    今天是2017年最后一晚,希望大家元旦前夕玩得开心,准备迎接2018全新的一年,活出程序员的态度. 最近发现有些女孩在朋友圈发的自拍照肤白貌美,甚至头上魔幻般地长出猫耳朵.猫鼻子.猫胡须,各种调皮搞怪 ...

  7. 用seaborn 画出唯美的论文专用图片,自己定制python画图的数据集

    写在前面的话 好久不来,随便看了下CSDN推送的热门文章,标题都相当无耻了啊,大家为了骗阅读量都把标题取得这么骚.而且像我这么俗的人,肯定也是必须要为强权低头的,妈呀.这个标题我自己看着眼睛都有点疼, ...

  8. [css] 用CSS画出一个任意角度的扇形,可以写多种实现的方法

    [css] 用CSS画出一个任意角度的扇形,可以写多种实现的方法 先画一个圆,外加两个绝对定位的半圆 扇形可以通过两个半圆作为遮罩旋转来露出相应的角度实现 这只能切出180°以内的扇形 超过180°的 ...

  9. 从零开始学Python爬虫系列:Matplotlib FuncAnimation这1个功能,加1个更新函数,画出最简单的动图,让你爬取的数据动起来。(附:图片上加弹幕功能)

    使用FuncAnimation这个包之前,别忘了安装ImageMagick,具体的安装过程可以看我bar chart race那一篇. Animation 动画的基础函数. FuncAnimation ...

最新文章

  1. 使用docker搭建一个elasticsearch(5.4)的基础环境
  2. 《物联网框架ServerSuperIO教程》- 23.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率...
  3. 你的数据也可以-三篇NAR的数据库
  4. html暂停计时器,JS实现可暂停秒表计时器效果的方法
  5. 比dropout更好的方法_比较自己的更好方法
  6. 如何用matlab分析代谢,代谢流分析工具-CellNetAnalyzer
  7. 蒋涛:重新回归的我,将带领 CSDN 全方位升级,为 AI 转型者打造一站式平台
  8. 减少访问量_Nginx服务器高性能优化轻松实现10万并发访问量
  9. MySQL的IFNULL解决判空问题
  10. 怎样从外网访问自己的HTTP服务器
  11. C 线程同步的四种方式(Linux)
  12. 几种常用的数据校验(异常检测)总结(3σ、肖维勒准则、狄克逊准则、格拉布斯准则、皮尔士准则、卡方检验、T检验等等)
  13. javaweb课程设计房屋租赁系统
  14. cad问题小百科 持续更新
  15. EXECUTE IMMEDIATE用法小结
  16. 控制台安装selenium运行浏览器报错TypeError: ‘module‘ object is not callable
  17. html时间戳转日期
  18. 2021-05-01Java面试知识点
  19. mysql 查询后根据值的不同进行判断与修改,SQL中的条件判断语句(case when zhen)用法
  20. 5G无线关键技术 — 非正交多址接入技术

热门文章

  1. MTK王者归来,它曾犯的5个错误也值得本土芯片公司引鉴
  2. 利用git,使U盘作为仓库
  3. 银行笔试备考规划:笔试类型+笔试细节+各模块占比
  4. android 键盘遮挡,Android软键盘遮挡的四种解决方案
  5. 魅族计算机记录,魅族Flyme这个功能太好了,90%的人都不知道,用过的都说好
  6. 流行学习Manifold Learning
  7. Android-线程与多线程(了解)
  8. Android 6.0手机存储图片以及下载apk需要申请动态权限
  9. 微信小程序真的能赚钱吗?
  10. CloudComparePCL RANSAC提取圆柱体