用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 相关文章推荐
35款精致的 CSS3 和 HTML5 网页模板 推荐
Aug 03 HTML / CSS
CSS3 二级导航菜单的制作的示例
Apr 02 HTML / CSS
CSS3 清除浮动的方法示例
Jun 01 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
Nov 30 HTML / CSS
详解rem 适配布局
Oct 31 HTML / CSS
HTML5语音识别标签写法附图
Nov 18 HTML / CSS
使用分层画布来优化HTML5渲染的教程
May 08 HTML / CSS
很酷的HTML5电子书翻页动画特效
Feb 25 HTML / CSS
浅析HTML5:'data-'属性的作用
Jan 23 HTML / CSS
小程序canvas中文字设置居中锚点
Apr 16 HTML / CSS
HTML5 Canvas 实现K线图的示例代码
Dec 23 HTML / CSS
html form表单基础入门案例讲解
Jul 15 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
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
使用PHP破解防盗链图片的一个简单方法
2014/06/07 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
JavaScript多图片上传案例
2015/09/28 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python分割列表(list)的方法示例
2017/05/07 Python
python绘制多个曲线的折线图
2020/03/23 Python
关于python多重赋值的小问题
2019/04/17 Python
Python基于当前时间批量创建文件
2020/05/07 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
以下的初始化有什么区别
2013/12/16 面试题
物理学专业求职信
2014/07/04 职场文书
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL