用canvas实现图片滤镜效果详解之视频效果
这是一个很有意思的特效,模拟摄像机拍摄电视屏幕画面时出现点状颗粒的效果。颗粒的大小通过变换矩阵实现,可以任意调节,有兴趣研究的朋友可以尝试更多的效果,代码没有经过优化,只是一个粗糙的Demo,大家可以自行改进。
1.获取图像数据
img.src = ’http://bloglaotou.duapp.com/wp-content/themes/frontopen2/tools/filter/image2.jpg’;
canvas.width = img.width;
canvas.height = img.height;
var context = canvas.getContext(“2d”);
context.drawImage(img, 0, 0);
var canvasData = context.getImageData(0, 0, canvas.width, canvas.height);
2.设置过滤矩阵
var m_VideoType=0;
var pattern=new Array();
switch (m_VideoType)
{
case0://VIDEO_TYPE.VIDEO_STAGGERED:
{
pattern = [
0, 1,
0, 2,
1, 2,
1, 0,
2, 0,
2, 1,
];
break;
}
case1://VIDEO_TYPE.VIDEO_TRIPED:
{
pattern = [
0,
1,
2,
];
break;
}
case2://VIDEO_TYPE.VIDEO_3X3:
{
pattern =
[
0, 1, 2,
2, 0, 1,
1, 2, 0,
];
break;
}
default:
{
pattern =
[
0, 1, 2, 0, 0,
1, 1, 1, 2, 0,
0, 1, 2, 2, 2,
0, 0, 1, 2, 0,
0, 1, 1, 1, 2,
2, 0, 1, 2, 2,
0, 0, 0, 1, 2,
2, 0, 1, 1, 1,
2, 2, 0, 1, 2,
2, 0, 0, 0, 1,
1, 2, 0, 1, 1,
2, 2, 2, 0, 1,
1, 2, 0, 0, 0,
1, 1, 2, 0, 1,
1, 2, 2, 2, 0,
];
break;
}
}
var pattern_width = [ 2, 1, 3, 5 ];
var pattern_height = [6, 3, 3, 15 ];
3.获取过滤数据
for ( var x = 0; x < canvasData.width; x++) {
         for ( var y = 0; y < canvasData.height; y++) {    
           // Index of the pixel in the array
           var idx = (x + y * canvasData.width) * 4;
           var r = canvasData.data[idx + 0];
           var g = canvasData.data[idx + 1];
           var b = canvasData.data[idx + 2];
              var nWidth = pattern_width[m_VideoType];
              var nHeight = pattern_height[m_VideoType];
              var index = nWidth * (y % nHeight) + (x % nWidth);  
              index = pattern[index];
              if (index == 0)
               var   r = fclamp0255(2 * r);
              if (index == 1)
               var   g = fclamp0255(2 * g);
              if (index == 2)
               var   b = fclamp0255(2 * b);  
            // assign gray scale value
            canvasData.data[idx + 0] = r; // Red channel
            canvasData.data[idx + 1] = g; // Green channel
            canvasData.data[idx + 2] = b; // Blue channel
            canvasData.data[idx + 3] = 255; // Alpha channel
            // 加上黑色的边框
            if(x < 8 || y < 8 || x > (canvasData.width - 8) || y > (canvasData.height - 8))
            {
              canvasData.data[idx + 0] = 0;
              canvasData.data[idx + 1] = 0;
              canvasData.data[idx + 2] = 0;
            }
         }
    }
4.写入过滤后的数据
context.putImageData(canvasData, 0, 0);
5.效果预览
点击这里预览
5.参考资料
用canvas实现图片滤镜效果详解之视频效果的更多相关文章
- 用canvas实现图片滤镜效果详解之灰度效果
		
前面展示了一些canvas实现图片滤镜效果的展示,并且给出了相应的算法,下面来介绍一下具体的实现方法. 前面介绍的特效中灰度效果最简单,就从这里开始介绍吧. 1.获取图像数据 img.src = ’h ...
 - PNG,JPEG,BMP,JIF图片格式详解及其对比
		
原文地址:http://blog.csdn.net/u012611878/article/details/52215985 图片格式详解 不知道大家有没有注意过网页里,手机里,平板里的图片,事实上,图 ...
 - .NET DLL 保护措施详解(三)最终效果
		
针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...
 - android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
		
shape使用.渐变色.分割线.边框.半透明.半透明阴影效果. 首先简单了解一下shape中常见的属性.(详细介绍参看 api文档 ) 转载请注明:Rflyee_大飞: http://blog.cs ...
 - ios学习--详解IPhone动画效果类型及实现方法
		
详解IPhone动画效果类型及实现方法是本文要介绍的内容,主要介绍了iphone中动画的实现方法,不多说,我们一起来看内容. 实现iphone漂亮的动画效果主要有两种方法,一种是UIView层面的,一 ...
 - [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
		
本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...
 - Canvas入门到高级详解(中)
		
三. canvas 进阶 3.1 Canvas 颜色样式和阴影 3.1.1 设置填充和描边的颜色(掌握) fillStyle : 设置或返回用于填充绘画的颜色 strokeStyle: 设置或返回用于 ...
 - 用canvas实现图片滤镜效果
		
1.灰度效果 图片过滤效果之灰度效果 算法及原理: .299 * r + .587 * g + .114 * b; 2.油画效果 算法及原理: 用当前点四周一定范围内任意一点的颜色来替代当前点颜色,最 ...
 - Canvas学习:globalCompositeOperation详解
		
在默认情况之下,如果在Canvas之中将某个物体(源)绘制在另一个物体(目标)之上,那么浏览器就会简单地把源特体的图像叠放在目标物体图像上面. 简单点讲,在Canvas中,把图像源和目标图像,通过Ca ...
 
随机推荐
- 条件随机场CRF简介
			
http://blog.csdn.net/xmdxcsj/article/details/48790317 Crf模型 1. 定义 一阶(只考虑y前面的一个)线性条件随机场: 相比于最大熵模型的输 ...
 - 作品展示,JavaScript 版水果忍者
			
点这里 <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版的切水果游戏由百度 JS 小组开发,采用 vml + svg 绘图,使用了 R ...
 - ExtJs之Ext.core.Element
			
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
 - gridview 绑定方法中带参数
			
OnClientClick='javascript:OrderDetailShow("<%# Eval('OrderType')%>")' 上面这种方式是错的法一: & ...
 - 两台笔记本搭建openvswitch网络
			
环境说明: 笔记本A.B均运行Ubuntu 14.04,两台笔记本通过无线网卡上网,用一根网线连接两台笔记本的有线网卡. 网络拓扑: 其中,vm1 vm2 S1位于笔记本A,vm3 vm4 S2位于笔 ...
 - unity  Transform Find 的用法!!!
			
用法: Transform Find(String name) 1.查找名为name的(transform.gameObject)直接子物体并返回该子物体的Transform属性.不能是孙子物体或更低 ...
 - eclipse导入的工程前面有感叹号是什么意思
			
1.尤其是从其他地方拷贝来并且直接加载的工程,刚打开往往会看到工程的图标上有个红色的感叹号,这是因为build path 出错了,里面有缺失或者无法找到的包. 2. 原因:显示红色感叹号是因为jar包 ...
 - opencv 人脸识别 (一)训练样本的处理
			
本文实现基于eigenface的人脸检测与识别.给定一个图像数据库,进行以下步骤: 进行人脸检测,将检测出的人脸存入数据库2 对数据库2进行人脸建模 在测试集上进行recognition 本篇实现 ...
 - android ProgressBar 样式讲解
			
转载自:eoe社区,可惜没找到源地址... 多式样ProgressBar 普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中. 一 ...
 - 在android.app.Application中定义全局变量
			
在Android应用中使用全局变量,除了public的静态变量,还有更优雅的方式是使用android.app.Application. 启动Application时,系统会创建一个PID,即进程ID, ...