html5中文学习网

您的位置: 首页 > html5教程 > 入门教程 » 正文

用canvas实现图片滤镜效果附演示_html5教程技巧

[ ] 已经帮助:人解决问题
点评:这是一个模拟摄像机拍摄电视屏幕画面时出现点状颗粒的效果,有兴趣研究的朋友可以尝试更多的效果,代码没有经过优化,只是一个粗糙的Demo,喜欢的朋友可以研究下
这是一个很有意思的特效,模拟摄像机拍摄电视屏幕画面时出现点状颗粒的效果。颗粒的大小通过变换矩阵实现,可以任意调节,有兴趣研究的朋友可以尝试更多的效果,代码没有经过优化,只是一个粗糙的Demo,大家可以自行改进。 qhJHTML5中文学习网 - HTML5先行者学习网
qhJHTML5中文学习网 - HTML5先行者学习网
1.获取图像数据 qhJHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
qhJHTML5中文学习网 - HTML5先行者学习网
img.src = ’http://bloglaotou.duapp.com/wp-content/themes/frontopen2/tools/filter/image2.jpg’; qhJHTML5中文学习网 - HTML5先行者学习网
canvas.width = img.width; qhJHTML5中文学习网 - HTML5先行者学习网
canvas.height = img.height; qhJHTML5中文学习网 - HTML5先行者学习网
var context = canvas.getContext(“2d”); qhJHTML5中文学习网 - HTML5先行者学习网
context.drawImage(img, 0, 0); qhJHTML5中文学习网 - HTML5先行者学习网
var canvasData = context.getImageData(0, 0, canvas.width, canvas.height); qhJHTML5中文学习网 - HTML5先行者学习网
qhJHTML5中文学习网 - HTML5先行者学习网
2.设置过滤矩阵 qhJHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
qhJHTML5中文学习网 - HTML5先行者学习网
var m_VideoType=0; qhJHTML5中文学习网 - HTML5先行者学习网
var pattern=new Array(); qhJHTML5中文学习网 - HTML5先行者学习网
switch (m_VideoType) qhJHTML5中文学习网 - HTML5先行者学习网
{ qhJHTML5中文学习网 - HTML5先行者学习网
case0://VIDEO_TYPE.VIDEO_STAGGERED: qhJHTML5中文学习网 - HTML5先行者学习网
{ qhJHTML5中文学习网 - HTML5先行者学习网
pattern = [ qhJHTML5中文学习网 - HTML5先行者学习网
0, 1, qhJHTML5中文学习网 - HTML5先行者学习网
0, 2, qhJHTML5中文学习网 - HTML5先行者学习网
1, 2, qhJHTML5中文学习网 - HTML5先行者学习网
1, 0, qhJHTML5中文学习网 - HTML5先行者学习网
2, 0, qhJHTML5中文学习网 - HTML5先行者学习网
2, 1, qhJHTML5中文学习网 - HTML5先行者学习网
]; qhJHTML5中文学习网 - HTML5先行者学习网
break; qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
case1://VIDEO_TYPE.VIDEO_TRIPED: qhJHTML5中文学习网 - HTML5先行者学习网
{ qhJHTML5中文学习网 - HTML5先行者学习网
pattern = [ qhJHTML5中文学习网 - HTML5先行者学习网
0, qhJHTML5中文学习网 - HTML5先行者学习网
1, qhJHTML5中文学习网 - HTML5先行者学习网
2, qhJHTML5中文学习网 - HTML5先行者学习网
]; qhJHTML5中文学习网 - HTML5先行者学习网
break; qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
case2://VIDEO_TYPE.VIDEO_3X3: qhJHTML5中文学习网 - HTML5先行者学习网
{ qhJHTML5中文学习网 - HTML5先行者学习网
pattern = qhJHTML5中文学习网 - HTML5先行者学习网
[ qhJHTML5中文学习网 - HTML5先行者学习网
0, 1, 2, qhJHTML5中文学习网 - HTML5先行者学习网
2, 0, 1, qhJHTML5中文学习网 - HTML5先行者学习网
1, 2, 0, qhJHTML5中文学习网 - HTML5先行者学习网
]; qhJHTML5中文学习网 - HTML5先行者学习网
break; qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
default: qhJHTML5中文学习网 - HTML5先行者学习网
{ qhJHTML5中文学习网 - HTML5先行者学习网
pattern = qhJHTML5中文学习网 - HTML5先行者学习网
[ qhJHTML5中文学习网 - HTML5先行者学习网
0, 1, 2, 0, 0, qhJHTML5中文学习网 - HTML5先行者学习网
1, 1, 1, 2, 0, qhJHTML5中文学习网 - HTML5先行者学习网
0, 1, 2, 2, 2, qhJHTML5中文学习网 - HTML5先行者学习网
0, 0, 1, 2, 0, qhJHTML5中文学习网 - HTML5先行者学习网
0, 1, 1, 1, 2, qhJHTML5中文学习网 - HTML5先行者学习网
2, 0, 1, 2, 2, qhJHTML5中文学习网 - HTML5先行者学习网
0, 0, 0, 1, 2, qhJHTML5中文学习网 - HTML5先行者学习网
2, 0, 1, 1, 1, qhJHTML5中文学习网 - HTML5先行者学习网
2, 2, 0, 1, 2, qhJHTML5中文学习网 - HTML5先行者学习网
2, 0, 0, 0, 1, qhJHTML5中文学习网 - HTML5先行者学习网
1, 2, 0, 1, 1, qhJHTML5中文学习网 - HTML5先行者学习网
2, 2, 2, 0, 1, qhJHTML5中文学习网 - HTML5先行者学习网
1, 2, 0, 0, 0, qhJHTML5中文学习网 - HTML5先行者学习网
1, 1, 2, 0, 1, qhJHTML5中文学习网 - HTML5先行者学习网
1, 2, 2, 2, 0, qhJHTML5中文学习网 - HTML5先行者学习网
]; qhJHTML5中文学习网 - HTML5先行者学习网
break; qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
var pattern_width = [ 2, 1, 3, 5 ]; qhJHTML5中文学习网 - HTML5先行者学习网
var pattern_height = [6, 3, 3, 15 ]; qhJHTML5中文学习网 - HTML5先行者学习网
qhJHTML5中文学习网 - HTML5先行者学习网
3.获取过滤数据 qhJHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
qhJHTML5中文学习网 - HTML5先行者学习网
for ( var x = 0; x < canvasData.width; x++) { qhJHTML5中文学习网 - HTML5先行者学习网
for ( var y = 0; y < canvasData.height; y++) { qhJHTML5中文学习网 - HTML5先行者学习网
// Index of the pixel in the array qhJHTML5中文学习网 - HTML5先行者学习网
var idx = (x + y * canvasData.width) * 4; qhJHTML5中文学习网 - HTML5先行者学习网
var r = canvasData.data[idx + 0]; qhJHTML5中文学习网 - HTML5先行者学习网
var g = canvasData.data[idx + 1]; qhJHTML5中文学习网 - HTML5先行者学习网
var b = canvasData.data[idx + 2]; qhJHTML5中文学习网 - HTML5先行者学习网
var nWidth = pattern_width[m_VideoType]; qhJHTML5中文学习网 - HTML5先行者学习网
var nHeight = pattern_height[m_VideoType]; qhJHTML5中文学习网 - HTML5先行者学习网
var index = nWidth * (y % nHeight) + (x % nWidth); qhJHTML5中文学习网 - HTML5先行者学习网
index = pattern[index]; qhJHTML5中文学习网 - HTML5先行者学习网
if (index == 0) qhJHTML5中文学习网 - HTML5先行者学习网
var r = fclamp0255(2 * r); qhJHTML5中文学习网 - HTML5先行者学习网
if (index == 1) qhJHTML5中文学习网 - HTML5先行者学习网
var g = fclamp0255(2 * g); qhJHTML5中文学习网 - HTML5先行者学习网
if (index == 2) qhJHTML5中文学习网 - HTML5先行者学习网
var b = fclamp0255(2 * b); qhJHTML5中文学习网 - HTML5先行者学习网
// assign gray scale value qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 0] = r; // Red channel qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 1] = g; // Green channel qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 2] = b; // Blue channel qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 3] = 255; // Alpha channel qhJHTML5中文学习网 - HTML5先行者学习网
// 加上黑色的边框 qhJHTML5中文学习网 - HTML5先行者学习网
if(x < 8 || y < 8 || x > (canvasData.width - 8) || y > (canvasData.height - 8)) qhJHTML5中文学习网 - HTML5先行者学习网
{ qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 0] = 0; qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 1] = 0; qhJHTML5中文学习网 - HTML5先行者学习网
canvasData.data[idx + 2] = 0; qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
} qhJHTML5中文学习网 - HTML5先行者学习网
qhJHTML5中文学习网 - HTML5先行者学习网
4.写入过滤后的数据 qhJHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
qhJHTML5中文学习网 - HTML5先行者学习网
context.putImageData(canvasData, 0, 0); qhJHTML5中文学习网 - HTML5先行者学习网
qhJHTML5中文学习网 - HTML5先行者学习网
5.参考资料 qhJHTML5中文学习网 - HTML5先行者学习网
代震军ImageFilter开源项目qhJHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助