用canvas实现图片滤镜效果附演示


Posted in HTML / CSS onNovember 05, 2013

这是一个很有意思的特效,模拟摄像机拍摄电视屏幕画面时出现点状颗粒的效果。颗粒的大小通过变换矩阵实现,可以任意调节,有兴趣研究的朋友可以尝试更多的效果,代码没有经过优化,只是一个粗糙的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.参考资料
代震军ImageFilter开源项目
HTML / CSS 相关文章推荐
css3实现信纸/同学录效果的示例代码
Dec 11 HTML / CSS
深入浅出CSS3 background-clip,background-origin和border-image教程
Jan 27 HTML / CSS
CSS3 滤镜 webkit-filter详细介绍及使用方法
Dec 27 HTML / CSS
纯CSS实现的大小渐变、渐远效果
Apr 15 HTML / CSS
CSS3实现伪类hover离开时平滑过渡效果示例
Aug 10 HTML / CSS
css3的动画特效之动画序列(animation)
Dec 22 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
Mar 24 HTML / CSS
html5记忆翻牌游戏实现思路及代码
Jul 25 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
Jul 02 HTML / CSS
基于html5绘制圆形多角图案
Apr 21 HTML / CSS
关于h5中的fetch方法解读(小结)
Nov 15 HTML / CSS
一文彻底解决HTML5页面中长按保存图片功能
Jun 10 HTML / CSS
html5 的a标签 Href 拨电话的写法
Nov 04 #HTML / CSS
HTML5和以前HTML4的区别整理
Oct 20 #HTML / CSS
html5开发之viewport使用
Oct 17 #HTML / CSS
HTML5计时器小例子
Oct 15 #HTML / CSS
HTML5 canvas画矩形时出现边框样式不一致的解决方法
Oct 14 #HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
Sep 22 #HTML / CSS
HTML5实现锚点时请使用id取代name
Sep 06 #HTML / CSS
You might like
php print EOF实现方法
2009/05/21 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
2010/09/10 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
Python变量作用范围实例分析
2015/07/07 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
同学聚会欢迎辞
2014/01/14 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
年会主持人开场白台词
2015/05/29 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android