java实现抠图 java图片滤镜 您所在的位置:网站首页 电脑抠图软件哪个简单一点 java实现抠图 java图片滤镜

java实现抠图 java图片滤镜

2023-06-07 14:35| 来源: 网络整理| 查看: 265

       上节中我们实现了相机主体的设置,接下来实现监听器以及多线程。在监听器中,首先我们要获得事件源的信息,上一节中我们对不同的按钮设置了不同的actionCommand值,所以先获取它们的actionCommand值,代码为ac =e.getActionCommand();然后对ac值进行判断并分类即可,接着我们获取ac值后,也要得到按钮的文本内容,首先使用getSource方法,得到事件源对象,getSource方法的返回值是Object,为了使用JButton类的getText方法,需要进行强制转型,代码为

JButton jbu =(JButton)e.getSource;name = jbu.getText();然后进行区分即可。

       然后介绍一下多线程,多线程就是指可以同时执行多个任务。因为打开相机后,要进行一个while(true)循环,使用画笔持续进行图像的绘制,那么此时我们再点窗体上的其他按钮是点不了的,所以我们把这个无限死循环放到一个单独的线程之内,不把它和我们的其余代码放入同一个线程。实现线程有两个方法。首先介绍第一种方法,Thread类是整个线程的管理类,管理线程的生命周期,负责启动运行停止等,我们首先创建类继承Thread类,然后在子类中重写run方法,这个方法中写的就是分支任务,我们可以把死循环放到分支任务中,例如代码可以是,public RunVideoThread extends Thread{public void run(){...分支任务...}},然后启动线程,创建这个子类的对象,然后调用start方法即可,RunVideoThread rvt = new RunVideoThread();rvt.start();以上即为第一种方法。然后介绍第二种方法,使用到了Runnable接口,首先也是创建子类来继承接口,然后重写run方法,把分支任务放到run方法中,代码为public RunVideoable implements Runnable{public void run(){...分支任务...}},然后在程序需要的创建子类(RunVideoable)对象rva,接着使用Thread类的有参构造方法,参数为RunVideoable创建的对象,然后用Thread类的新对象去调用start方法即可,代码为RunVideoable rva = new RunVideoable(); Thread tf = new Thread(rva); tf.start();。

       接着就开始写线程类RunVideoAble,在线程类中除了重写run方法之外,还可以写一下其他的方法,个人理解为辅助的方法,同时也需要设置一下其他的属性,比如,需要调用摄像头类的变量(获取照片),代码为public Webcam webcam;然后是画笔(需要它画出图像),public Graphics g;接着是一个标志变量flag(先默认为false),public boolean flag=false;然后在run方法中,要对当前的图片操作按钮进行判定,然后决定是用哪个滤镜,所以这里定义字符串变量来表明,代码为public String videoOP,,然后我们在监听器类中需要对它进行修改,所以设置方法setVideoOP,然后对于摄像头得到的图片也要保存一下,因为在滤镜选择时,会把这个图作为滤镜方法的参数。然后设置构造方法,代码为public void setVideoOP(String videoOP){this.videoOP=videoOP;}在监听器中我们把摄像头和画笔传过来。传到这个线程类中。代码如图

java实现抠图 java图片滤镜_滤镜

       接下来加入滤镜方法,这个方法比较复杂,可以写成一个类,这各类中不同的滤镜方法有不同的步骤,但参数都是画笔g和输入图像image,属于BufferedImage类。这里直接给出该部分的滤镜方法的代码,包括原图,二值化,马赛克以及灰度图。

java实现抠图 java图片滤镜_监听器_02

java实现抠图 java图片滤镜_ide_03

然后,回到线程类,设置open方法和close方法,open方法把flag变成true,然后将webcam打开(这里要注意,得到webcam不够,还需要打开),然后设置getImage方法,返回图片image。接着就开始写run类,首先分局摄像头得到照片,代码为image =webcam.getImage();接着就对当前线程对象的videoOP进行判断,然后决定滤镜类对象调用哪个方法,用if...else if 语句或者case语句均可。run方法代码如图所示。

java实现抠图 java图片滤镜_大数据_04

接着就再回到监听器中,当ac值时camOP,那么执行camOP(),写一下camOP方法,首先当按钮是启动时,webcam = Webcam.getDafault();接着创建线程类新对象,代码为RunVideonable rva =new RunVideoabl(g,webcam),把监听器对象的画笔和摄像头都传给线程新对象rva,然后我们使用代码rva.open()打开相机和修改flag值;接着Thread tf =new Thread(rva);tf.start()。然后当按钮是关闭时,我们使用代码rva.close()使得当前的run方法结束同时关闭摄像头;当按钮是拍照时,我们使用rva返回照片,代码为Buffered image1=rva.getImage();接着创建文件选择器,设置文件名过滤器,把图片存起来,代码如图所示。

java实现抠图 java图片滤镜_监听器_05

       然后当ac等于videoOP时,我们用代码rva.setVideoOP(name)来修改线程类新对象rva的属性,然后在执行run方法时会根据videoOP属性的改变展现不同的效果。

java实现抠图 java图片滤镜_大数据_06

如图是一张马赛克效果图。至此,滤镜相机的各部分已介绍完毕,和做一个项目的思路相同,都是注意在各个功能类之间注意参数的传递,不要遗漏参数。如有问题欢迎批评指正。

 

 

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有