在之前的文章中,给大家介绍了如果使用WebCamp来使用电脑的摄像头以及如何为图片添加各种滤镜,那么在这我们进行一个相互结合,就构成了一个我们pc端的美颜相机。

1.第一步和之前一样,就是框体 的创建,以及按钮的相关设置

public class Draw0211 {public void get(){JFrame jFrame=new JFrame();jFrame.setTitle("小浩美颜相机摄像");jFrame.setSize(800,900);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.setLocationRelativeTo(null);BorderLayout borderLayout=new BorderLayout();jFrame.setLayout(borderLayout);//面板类对象的设定以及添加到窗体,和设置窗体的位置JPanel center=new JPanel();//颜色设定center.setBackground(Color.cyan);//设置爱完以后需要添加到窗体,否则无效jFrame.add(center,BorderLayout.CENTER);//监听器的设置Mouse0211 mouse0211=new Mouse0211();//开始定义菜单,菜单栏以及相关按钮JMenuBar jMenuBar=new JMenuBar();jFrame.add(jMenuBar,BorderLayout.NORTH);//定义在菜单栏中的菜单选项String[]name1={"文件","视频","图片","拍照","特殊滤镜","编辑","帮助"};//开辟一个menu数组来存储调用与添加JMenu[]menu=new JMenu[name1.length];for (int i=0;i< name1.length;i++) {JMenu jMenu = new JMenu(name1[i]);menu[i]=jMenu;jMenuBar.add(jMenu);}//子菜单中的菜单选项String[]name={"打开","关闭","退出"};for (int i=0;i<name.length;i++) {JMenuItem jMenuItem = new JMenuItem(name[i]);jMenuItem.addActionListener(mouse0211);menu[0].add(jMenuItem);}String[]name2={"打开摄像头","关闭摄像头","录制"};for (int i=0;i<name2.length;i++) {JMenuItem jMenuItem = new JMenuItem(name2[i]);jMenuItem.addActionListener(mouse0211);menu[1].add(jMenuItem);}String[]name3={"原图","马赛克","灰度","油画","珠纹","素描"};for (int i=0;i<name3.length;i++) {JMenuItem jMenuItem = new JMenuItem(name3[i]);jMenuItem.addActionListener(mouse0211);menu[2].add(jMenuItem);}String[]name4={"打开","关闭","保存"};for (int i=0;i<name4.length;i++) {JMenuItem jMenuItem = new JMenuItem(name4[i]);jMenuItem.addActionListener(mouse0211);menu[3].add(jMenuItem);}String[]name5={"怀旧","梦幻","浮雕","卷积","哈哈镜"};for (int i=0;i<name5.length;i++) {JMenuItem jMenuItem = new JMenuItem(name5[i]);jMenuItem.addActionListener(mouse0211);menu[4].add(jMenuItem);}String[]name6={"左旋转90度","右旋转90度","左旋转180度","右旋转180度"};for (int i=0;i<name6.length;i++) {JMenuItem jMenuItem = new JMenuItem(name6[i]);jMenuItem.addActionListener(mouse0211);menu[5].add(jMenuItem);}String[]name7={"撤回"};for (int i=0;i<name7.length;i++) {JMenuItem jMenuItem = new JMenuItem(name7[i]);jMenuItem.addActionListener(mouse0211);menu[6].add(jMenuItem);}jFrame.setVisible(true);//画笔的传输mouse0211.graphicsmouse=center.getGraphics();}public static void main(String[] args) {Draw0211 draw0211=new Draw0211();draw0211.get();}
}

2.第二步通过监听器来获取按钮的点击,来获取调动命令,并对线程的启用以及滤镜的编写

public class Mouse0211  implements ActionListener {//画笔public Graphics graphicsmouse;//name来获取点击的名字public String name;//类来传递数据public Thread0211 thread0211;//监听器的接口方法使用public void actionPerformed(ActionEvent e){name=e.getActionCommand();System.out.println("正在点击的操作按钮为:"+name);if ("打开摄像头".equals(name)){//开始启动多线程,并且同时创建线程对象则显示线程创建一次if (thread0211==null){thread0211=new Thread0211(graphicsmouse,this);//开始启动线程thread0211.start();}}else if ("关闭摄像头".equals(name)){thread0211.flag=false;System.out.println("关闭");}if("原图".equals(name)){thread0211.name="原图";}if ("灰度".equals(name)){thread0211.name="灰度";}if ("马赛克".equals(name)){thread0211.name="马赛克";}if ("油画".equals(name)){thread0211.name="油画";}if ("哈哈镜".equals(name)){thread0211.name="哈哈镜";}if ("珠纹".equals(name)){thread0211.name="珠纹";}if ("素描".equals(name)){thread0211.name="素描";}}//灰度算法public BufferedImage drawHD(int[][] pixelArr) {//创建缓冲区BufferedImage bufferedImage = new BufferedImage(pixelArr.length,pixelArr[0].length, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();for (int i = 0; i < pixelArr.length; i++) {for (int j = 0; j < pixelArr[0].length; j++) {// 像素值int pixel = pixelArr[i][j];// 马赛克,灰度,底片// 转成Color对象,设置给画笔,画出像素点Color color = new Color(pixel);// 取出三原色int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();// 算法平均值int num = (red + blue + green) / 3;Color pixelColor = new Color(num, num, num);//设置缓冲区的像素值bufferedImage.setRGB(i, j, pixelColor.getRGB());// 把像素点画在缓冲图片上
//                buffG.setColor(pixelColor);
//                buffG.drawLine(i + 100, j + 100, i + 100, j + 100);}}return bufferedImage;}//马赛克算法public BufferedImage drawMSK(int[][] pixelArr) {//创建缓冲区BufferedImage bufferedImage = new BufferedImage(pixelArr.length,pixelArr[0].length, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();for (int i = 0; i < pixelArr.length; i += 3) {for (int j = 0; j < pixelArr[0].length; j += 3) {// 像素值int pixel = pixelArr[i][j];// 把像素点画在缓冲图片上buffG.setColor(new Color(pixel));buffG.fillRect(i, j, 10, 10);}}return bufferedImage;}//哈哈镜算法public BufferedImage drawHHJ(int x,int y,int[][] pixelArr) {;int w= pixelArr.length;int h= pixelArr[0].length;//计算中心点位置int zx=x-100;int zy=y-100;//放大半径,自己设置int r=100;//创建缓冲区BufferedImage bufferedImage = new BufferedImage(w,h, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();for (int i = 0; i <w; i++) {for (int j = 0; j <h;j++) {//计算当前位置是否在中心位置int tx=i-zx;int ty=j-zy;//当前点到中心点的距离int dis=(int) Math.sqrt(tx*tx+ty*ty);if (dis<r){//越靠近中心点,偏移量越大int nx=tx*dis/r+zx;int ny=ty*dis/r+zy;bufferedImage.setRGB(i,j,pixelArr[nx][ny]);}}}return bufferedImage;}//油画算法public BufferedImage drawYH(int[][] pixelArr) {//创建缓冲区BufferedImage bufferedImage = new BufferedImage(pixelArr.length,pixelArr[0].length, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();for (int i = 0; i < pixelArr.length; i++) {for (int j = 0; j < pixelArr[0].length; j++) {int pixel = pixelArr[i][j];Color color = new Color(pixel);buffG.setColor(color);Random random = new Random();int r = random.nextInt(10) + 5;buffG.fillOval(i, j, r, r);}}return bufferedImage;}//珠纹算法public BufferedImage drawZW(int[][] pixelArr) {//创建缓冲区BufferedImage bufferedImage = new BufferedImage(pixelArr.length,pixelArr[0].length, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();for (int i = 0; i < pixelArr.length; i += 4) {for (int j = 0; j < pixelArr[0].length; j += 4) {int pixel = pixelArr[i][j];Color color = new Color(pixel);buffG.setColor(color);buffG.fillOval(i, j, 8, 8);}}return bufferedImage;}//素描算法public BufferedImage drawSM(int[][] pixelArr) {//创建缓冲区BufferedImage bufferedImage = new BufferedImage(pixelArr.length,pixelArr[0].length, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();for (int i = 0; i < pixelArr.length; i += 2) {for (int j = 0; j < pixelArr[0].length; j += 2) {int pixel = pixelArr[i][j];Color color = new Color(pixel);int b = color.getBlue();if (b < 60) {buffG.setColor(Color.black);} else {buffG.setColor(Color.WHITE);}buffG.fillOval(i, j, 4, 4);}}return bufferedImage;}//旋转算法public BufferedImage drawXZ(int[][] pixelArr) {//创建缓冲区BufferedImage bufferedImage = new BufferedImage(pixelArr.length,pixelArr[0].length, BufferedImage.TYPE_INT_RGB);// 获取缓冲区画笔Graphics buffG = bufferedImage.getGraphics();int[][] newArr = new int[pixelArr[0].length][pixelArr.length];for (int i = 0, n = pixelArr.length - 1; i < pixelArr.length; i++, n--) {for (int j = 0; j < pixelArr[0].length; j++) {newArr[j][n] = pixelArr[i][j];}}return bufferedImage;}
}

3.线程类,并通过按钮调动滤镜算法

public class Thread0211 extends Thread {//画笔初始化public Graphics graphicsthread;//flag做标记来实现开关视频public boolean flag = true;//flag做标记来实现开关视频public int flag1 = 0;//滤镜名称public String name="原图";//类的对象构造public Mouse0211 mouse11;//处理后的缓冲图片public BufferedImage buffered;//构造方法进行参数的传递,初始化画笔对象public Thread0211(Graphics graphicsthread, Mouse0211 mouse11) {this.graphicsthread = graphicsthread;this.mouse11 = mouse11;}//处理线程,启动线程后运行的程序,run 方法执行完,该线程结束,线程一旦结束不能再次启动public void run() {//这个this给到的是什么System.out.println("启动线程.." + this.getName());//启动摄像头,在这个线程中使用Webcam webcam = Webcam.getDefault();webcam.open();while (flag) {// 获取摄像头拍到的数据BufferedImage bufferedImage = webcam.getImage();
//            if (name.equals("原图")) {
//                graphicsthread.drawImage(bufferedImage, 100, 100, 500, 400, null);
//            }
//            if (name.equals("灰度")) {
//                int[][] pixel = getImagePixel(bufferedImage);
//                buffered = mouse11.drawHD(pixel);
//                break;
//            }
//            if (name.equals("马赛克")){
//                    int[][] pixel = getImagePixel(bufferedImage);
//                    buffered = mouse11.drawMSK(pixel);
//                    System.out.println("222222222222222222");
//                    break;
//            }switch (name) {case "原图":graphicsthread.drawImage(bufferedImage, 100, 100, 600,600,null);break;case "灰度":int[][] pixel = getImagePixel(bufferedImage);buffered =mouse11.drawHD(pixel);break;case "马赛克":int[][] pixel1 = getImagePixel(bufferedImage);buffered = mouse11.drawMSK(pixel1);break;case "哈哈镜":int[][] pixel2 = getImagePixel(bufferedImage);buffered = mouse11.drawHHJ(200,200,pixel2);break;case "油画":int[][] pixel3 = getImagePixel(bufferedImage);buffered = mouse11.drawYH(pixel3);break;case "珠纹":int[][] pixel4 = getImagePixel(bufferedImage);buffered = mouse11.drawZW(pixel4);break;case "素描":int[][] pixel5 = getImagePixel(bufferedImage);buffered = mouse11.drawSM(pixel5);break;}//绘制滤镜效果graphicsthread.drawImage(buffered, 100, 100,600,600, null);if (name.equals("保存")){//保存图片的文件File file=new File("");try {ImageIO.write(buffered,"PNG",file);break;}catch (IOException e){e.printStackTrace();}}}}public int[][] getImagePixel(BufferedImage buffImage) {int w = buffImage.getWidth();int h = buffImage.getHeight();int[][] pixelArr = new int[w][h];// 获取图片中的每一个像素值保存到二维数组中for (int i = 0; i < w; i++) {for (int j = 0; j < h; j++) {int pixel = buffImage.getRGB(i, j);pixelArr[i][j] = pixel;}}return pixelArr;}
}

4.效果如下(菜单栏中些许功能没有完善,后续会继续完善)

(马赛克,油画,灰度,哈哈镜效果)

小浩浅谈之Java美颜相机pc端(视频)相关推荐

  1. 小浩浅谈利用Java做一个视频运动追踪识别

    寒假期间,一起做了一款pc端的美颜相机,在交流会期间,看到有的同学做了一些非常牛的功能添加,心血来潮,想整个视频运动追踪识别,在这和大家分析一下算法思路 1.原理很简单,就是在视频中的物体,就可以通过 ...

  2. 小浩浅谈之在Java中摄像头的使用

    在春节前夕,在陈哥的指导下,完成了美颜相机中一些滤镜效果的添加,但是之前滤镜效果的使用都是基于单独的图片,而我们的视频也是由一帧一帧的图片构成,所以我们在想完成美颜相机的情况下,首先要学会的是如何获取 ...

  3. 小浩浅谈如何为图片提供滤镜功能

    近些天,一直想做一个pc版的美颜相机,但是万事开头总要有第一步,首先就是美颜相机的添加滤镜问题,直接上手视频未免过于着急,于是就想先对单张图片来实现滤镜功能的添加. 1.第一步,就是窗体和面板的创立, ...

  4. 小浩浅谈Java三特性(封装,继承,多态)

    1.封装,什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量 ...

  5. 小浩浅谈 程序/进程/线程,并行/并发

    1.程序,随着时代和社会的发展,我们开始学习各种各样的计算机语言,开始离不开编程,但是我们需要了解的是,什么是程序?程序代表什么?以及程序的作用?以及我们编程,编写程序是为了干嘛? 在这,我认为程序指 ...

  6. 浅谈对java编程思想的理解

    浅谈对java编程思想的理解 刚从学校毕业的时候,对于这种概念的理解少之又少 ,只是单纯的从事编码工作,理解也只是停留在对java基本概念的使用上,很局限!随后工作了快三年的时间里,自己不断的理解这种 ...

  7. 解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!

    Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的 ...

  8. opencv运动目标跟踪预测_浅谈多目标跟踪中的相机运动

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 之前的文章中我介绍了 Kalman 滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场 ...

  9. 浅谈多目标跟踪中的相机运动

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 之前的文章中我介绍了 Kalman 滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场 ...

最新文章

  1. gtkorphan清理孤立软件包
  2. mysql int 默认值 为ull_数据类型--ULL、ll
  3. 什么决定了电商双11大促的成败
  4. oracle 创建触发器_oracle创建触发器
  5. 58.贪心算法练习:  最小新整数
  6. ThreadLocal 你到底是个什么鬼
  7. TD-SCDMA智能天线波束赋形能力的讨论
  8. C++总结篇(1)命名空间及引用
  9. oracle行列互换sql,解决Oracle行列转换问题的一个方法
  10. 如何连动作导入3dmax_教你如何将犀牛(Rhino)模型导入3dmax并进行渲染
  11. 数列分块入门 3(LibreOj-6279)
  12. ROS学习笔记(一)——软件版本的选择
  13. Centos 6.4 /var/log/secure 日志不记录问题
  14. MySQL索引的原理,B+树、聚集索引和二级索引的结构分析
  15. linux根据部署jenkins
  16. 网站转换APP源代码/WebAPP源代码/网站生成APP源代码/Flutter项目/带控制端
  17. 13. 用hexdump工具分析镜像的16进制代码
  18. web前端职业生涯路线
  19. 端口扫描工具Zenmap超详细使用方法+使用案例(windows)
  20. excel vba saveas 另存为使用方法

热门文章

  1. 格力董事风波意义何在?
  2. 手机端图片批量查询mui
  3. 【2019.4.2最新】error: stray '\302'或者\240的解决方案
  4. 计算机专业班级口号霸气顺口,史上最牛班级口号
  5. 快来嗨!《笑傲江湖ol》圣诞嘉韶华狂欢开端!--国民网游戏
  6. Math 相关的用法
  7. python字母表顺序向后偏移3,python3:完全字母顺序
  8. 《敏捷软件开发(原则模式与实践)》读书笔记
  9. linux--welcome to emergency mode
  10. :last-of-type | CSS属性参考