Canvas系列之滤镜效果


Posted in HTML / CSS onFebruary 12, 2019

Canvas 真的是一个神奇的东西,不仅能够绘制各种图形、文本和位图,还能够对位图进行复杂的像素运算和处理。因此像滤镜这些东西,其实 Canvas 也可以来实现。接下来,是见证奇迹的时刻。

首先,我们需要有一个 Canvas 容器,例如:

<canvas id="myCanvas" width="800" height="800"></canvas>

接下来,我们需要将使用 Canvas 来绘制一张图片:

var myCanvas = document.getElementById("myCanvas");
var ctx = myCanvas.getContext("2d");
var img = new Image();
img.src = "./images/1526010092000.jpg";	// 自备图片链接
img.onload = (e) => {
	ctx.drawImage(img, 0, 0, 800, 800);	// 第一个800表示绘制图片的宽,第二个800表示绘制图片的高
}

Canvas系列之滤镜效果

Canvas首次绘制的效果

再接下来就是对图片的像素进行一些操作。而要实现这样的操作,首先需要从 Canvas 获取到图片的像素信息,而获取这些信息可以通过 getImageData() 来实现。

// ... 省略前面代码
img.onload = (e) => {
	// ... 省略前面代码
    img = ctx.getImageData(0, 0, 800, 800);	// 获得包含每个像素点颜色的字节数据
}

由于图片的大小为 800 * 800,因为要对像素点进行遍历,以获得每一个像素点的红、绿、蓝色值。因此:

// ... 省略前面代码
img.onload = (e) => {
	// ... 省略前面代码
    var pixelLen = 800 * 800;   // 获得像素个数
    for(var i = 0; i < pixelLen * 4; i += 4) {
        var redC = img.data[i], // 第一个字节单位代表红色
            greenC = img.data[i + 1],    // 第二个字节单位代表绿色
            blueC = img.data[i + 2],   // 第三个字节单位代表蓝色
            alpha = img.data[i + 3];   // 第四个字节单位代表透明度
    }
}

通过上面循环,我们获取到了包含在图片数据中的每个像素点的具体色值;需要注意的一点是,每一个像素点的数据不是一位,而是相邻的四位,分别代表了该点的红、绿、蓝和透明值。因此,实际上位图字节数据的数组长度等于像素点个数乘以 4,在 for 循环中我们也针对这一特性进行了相应处理。

通过将每一点的红、绿、蓝值进行平均,然后再将生成的平均值相同地赋予该像素点的红、绿、蓝值,就能形成灰度效果,最后通过 putImageData() 方法来重新绘制图片即可,代码如下:

// ... 省略前面代码
img.onload = (e) => {
	// ... 省略前面代码
    for(var i = 0; i < pixelLen * 4; i += 4) {
   		// ... 省略前面代码
        var grey = parseInt((redC + greenC + blueC) / 3);  // 平均后获取灰度值
        img.data[i] = grey; // 改变红色值
        img.data[i + 1] = grey; // 改变绿色值
        img.data[i + 2] = grey; // 改变蓝色值
    }

    ctx.putImageData(img, 0, 0, 800, 800);  // 重新绘制图片
}

此时,则会形成灰度效果,如下图

Canvas系列之滤镜效果

Canvas第二次绘制图片-灰度效果

透明度的控制只需要修改第四个字节单位对应的数值即可,该数值的范围为0~256,0代表完全透明,256代表完成不透明。例如:

// ... 省略前面代码
img.onload = (e) => {
	// ... 省略前面代码
    for(var i = 0; i < pixelLen * 4; i += 4) {
   		// ... 省略前面代码
        img.data[i + 3] = 128;	// 透明度50%
    }
    // ... 省略前面代码
}

Canvas系列之滤镜效果

Canvas第三次绘制效果-增加透明度

由此,通过控制图片中每个像素4个数据的值,即可达到滤镜的效果,是不是 so easy!

参考文献:

《HTML5 基础知识、核心技术与前沿案例》 刘欢 编著

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3 media queries + jQuery实现响应式导航
Sep 30 HTML / CSS
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
Aug 18 HTML / CSS
CSS3混合模式mix-blend-mode/background-blend-mode简介
Mar 15 HTML / CSS
css3实现input输入框颜色渐变发光效果代码
Apr 02 HTML / CSS
html5嵌入内容_动力节点Java学院整理
Jul 07 HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
Jul 25 HTML / CSS
HTML5在a标签内放置块级元素示例代码
Aug 23 HTML / CSS
html5教程实现Photoshop渐变色效果
Dec 04 HTML / CSS
深入解析HTML5的IndexedDB索引数据库
Sep 14 HTML / CSS
canvas绘制圆角头像的实现方法
Jan 17 HTML / CSS
Html5定位终极解决方案
Feb 05 HTML / CSS
什么是clearfix (一文搞清楚css清除浮动clearfix)
May 21 HTML / CSS
canvas学习总结三之绘制路径-线段
Jan 31 #HTML / CSS
移动端Html5中百度地图的点击事件
Jan 31 #HTML / CSS
Html5页面内使用JSON动画的实现
Jan 29 #HTML / CSS
HTML5拍照和摄像机功能实战详解
Jan 24 #HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
Jan 24 #HTML / CSS
详解canvas绘制多张图的排列顺序问题
Jan 21 #HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
Jan 18 #HTML / CSS
You might like
php daodb插入、更新与删除数据
2009/03/19 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
javascript生成大小写字母
2015/07/03 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
vue实现中部导航栏布局功能
2019/07/30 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
django之常用命令详解
2016/06/30 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
社区活动总结报告
2014/05/05 职场文书
师德师风建设整改措施思想汇报
2014/10/11 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
房产电话营销开场白
2015/05/29 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
浅析JavaScript中的变量提升
2022/06/01 Javascript