众所周知视频是不能P的,所以一旦学会了视频滤镜,你就是最靓的仔!
创建一个滤镜类;
其实具体思路与之前的图片滤镜极为相似,故我直接将代码贴出来。
public BufferedImage grayimage(Graphics g,BufferedImage image){ int width=image.getWidth(); int height= image.getHeight(); for(int i=0;i<width;i++){ for(int j=0;j<height;j++){ rgb=image.getRGB(i,j); depart(rgb); gray=(int)(0.3*r+0.59*ge+0.11*b); addall(gray,gray,gray); image.setRGB(i,j,rgb); } } return image; }//灰化滤镜
这其中值得注意的有,setRGB的方法可以帮助我得到我们想要效果的图片。
同时注意返回值,以便后续的使用。
至于像马赛克效果比较特殊,要新创图片再用缓存图片的画笔绘制 ;
public BufferedImage masiimage(Graphics g,BufferedImage image){
int width=image.getWidth();
int height=image.getHeight();
BufferedImage newImage = new BufferedImage (width, height, BufferedImage.TYPE_INT_RGB);
Graphics bf= newImage.getGraphics();
for(int i=0;i<width;i+=5) {
for (int j = 0; j < height; j += 5) {
rgb = image.getRGB(i, j);
Color cl = new Color(rgb);
bf.setColor(cl);
bf.fillRect( i, j, 5, 5);
}
}
return newImage;
}//马赛克滤镜
完成这些后,我们用switch,完善一下多线程中的run方法,和修改一下监听器的逻辑;
同时利用JPanel将我们的界面变得更加美观:
public void ui() {
JFrame jf=new JFrame();
jf.setTitle("VIDEO");
jf.setSize(2000,2000);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//建立窗口
this.setBackground(Color.LIGHT_GRAY);
JPanel btnpnl=new JPanel();
btnpnl.setBackground(Color.white);
Dimension dim=new Dimension(300,200);
btnpnl.setPreferredSize(dim);
btnUI(btnname,btnpnl);
jf.add(this,BorderLayout.CENTER);
jf.add(btnpnl,BorderLayout.WEST);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
Graphics g=this.getGraphics();
ll.setGraphics(g);
}
最后成果如下:
当然使用完多线程后,要记得让run方法结束