了解CanvasRenderingContext2D.filter
简介
使用的滤镜函数和CSS filter属性一样。,CanvasRenderingContext2D.filter可以给Canvas图形设置各类滤镜效果
语法
context.filter = <filter-function1> [<filter-function2] [<filter-functionN]"; context.filter = none;
其中:
<filter-function>- 表示滤镜函数,详见这里,可以任意多个叠加。
none- 表示不使用滤镜效果。
滤镜函数
支持的滤镜函数如下表所示:
| 滤镜函数 | 释义 |
|---|---|
| url(#someId) | 使用ID是someId的SVG滤镜 |
| blur(5px) | 模糊 |
| brightness(2.4) | 亮度 |
| contrast(200%) | 对比度 |
| drop-shadow(4px 4px 8px blue) | 投影 |
| grayscale(50%) | 灰度 |
| hue-rotate(90deg) | 色调变化 |
| invert(75%) | 反相 |
| opacity(25%) | 透明度 |
| saturate(230%) | 饱和度 |
| sepia(60%) | 褐色 |
各个滤镜的渲染效果如下所示:
1. 模糊
context.filter = 'blur(5px)';

2. 亮度
数值越大越明亮,100%是原始亮度。
context.filter = 'brightness(240%)';

3. 对比度
数值越大对比度越大,100%是原始对比度。
context.filter = 'contrast(200%)';

4. 投影
支持4个参数值,分别是水平偏移大小、垂直偏移大小、模糊半径大小和投影的颜色。
context.filter = 'drop-shadow(4px 4px 8px blue)';

5. 灰度
0%表示完全灰度。
context.filter = 'grayscale(50%)';

6. 色调变化
任意的角度单位都可以,例如圈数、弧度、百分度等。
context.filter = 'hue-rotate(90deg)';

7. 反相
指色调完全翻转。
context.filter = 'invert(75%)';

8. 透明度
建议使用globalAlpha属性实现Canvas的半透明效果,因为兼容性更好。
context.filter = 'opacity(25%)';

9. 饱和度
数值越大,饱和度越高,100%是默认饱和度。
context.filter = 'saturate(230%)';

10. 褐色
让图形表现为褐色,默认是0%。
context.filter = 'sepia(60%)';

案例
局部高斯模糊的实现
由于IE和Safari浏览器并不支持这里的滤镜属性,因此,需要借助第三方的JS算法实现。
var eleImg = document.getElementById('image');
var canvasBlur = document.getElementById('localBlur');
if (eleImg && canvasBlur) {
var contextBlur = canvasBlur.getContext('2d');
var funDrawBlur = function () {
// 填充底部图像
contextBlur.drawImage(eleImg, 0, 0);
// 创建一个屏外canvas
var canvasOff = document.createElement('canvas');
canvasOff.width = canvasBlur.width;
canvasOff.height = canvasBlur.height;
var contextOff = canvasOff.getContext('2d');
// 执行模糊
if (typeof contextBlur.filter == 'string') {
// 支持canvas滤镜
contextOff.filter = 'blur(10px)';
// 绘制局部图像
contextOff.drawImage(eleImg, 100, 60, 300, 213, 100, 60, 300, 213);
// 上层图像绘制
contextBlur.drawImage(canvasOff, 0, 0);
} else {
// 不支持Canvas滤镜
// 使用第三方方法
var blurFixed = new Blur({
radius: 10,
// 高斯算法性能较差
gaussian : false
});
blurFixed.init();
// 先绘制局部图像
contextOff.drawImage(eleImg, 100, 60, 300, 213, 100, 60, 300, 213);
// 再执行模糊
var imgBlured = blurFixed.blurRGBA(canvasOff, null, true);
// 上层图像绘制
contextBlur.drawImage(imgBlured, 0, 0);
}
};
if (eleImg.naturalWidth) {
funDrawBlur();
} else {
eleImg.onload = funDrawBlur;
}
}
其他
规范文档
| 规范地址 | 规范状态 | 备注 |
|---|---|---|
|
HTML现行标准 这个规范中定义了'CanvasRenderingContext2D.filter' |
实验阶段 | - |
相关资源
暂无
兼容性
Chrome 52+、Firefox 49+,IE 不支持、Safari不支持、部分 Android 移动设备不支持。
by zhangxinxu 2021-09-26 22:06:00