了解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