canvas-worker和postmessage实现图片滤镜

59 篇文章 0 订阅
50 篇文章 1 订阅

canvas-worker和postmessage实现图片滤镜 目录


前言

  • postMessage:用于跨域的信息传递,此处用于worker的信息传递
  • worker:在H5中,允许出现多线程处理,可以缓解网站的性能瓶颈

注意

  • worker必须部署到服务器上Tomcat, apahce, live-server,并且启动时才能运行

代码展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="button" id="sunglassButton" value="Sunglasses">
    <canvas id="canvas"></canvas>
    <script src="main.js"></script>
</body>
</html>
// main.js
let image = new Image(),
    canvas = document.getElementById('canvas'),
    context = canvas.getContext('2d'),
    sunglassButton = document.getElementById('sunglassButton'),
    sunglassesOn = false,
    sunglassFilter = new Worker('sunglassFilter.js');

// Functions
function putSunglassesOn() {
    sunglassFilter.postMessage(
        context.getImageData(0,0,canvas.width,canvas.height)
    );

    sunglassFilter.onmessage = function(e) {
        context.putImageData(e.data,0,0);
    };
}

function drawOriginalImage(){
    context.drawImage(image,0,0,
                    image.width,image.height,0,0,
                    canvas.width,canvas.height);
}

// Event handlers
sunglassButton.onclick = function() {
    if(sunglassesOn){
        sunglassButton.value = 'Sunglasses';
        drawOriginalImage();
        sunglassesOn = false;
    }else {
        sunglassButton.value = 'Original pic';
        putSunglassesOn();
        sunglassesOn = true;
    }
}

// initialization
image.src = '1.jpg';
image.onload = function() {
    drawOriginalImage();
}
// worker
// sunglassFilter.js
onmessage = function(event) {
    console.log(event);
    let imagedata = event.data,
        data = imagedata.data,
        length = data.length,
        width = imagedata.width;


    for(let i = 0; i < length; ++i) {
        if((i+1) % 4 != 0 ){
            if((i+4) % (width*4) == 0) {
                data[i] = data[i - 4];
                data[i+1] = data[i - 3];
                data[i+2] = data[i-2];
                data[i+3] = data[i-1];
                i+=4;
            }else {
                data[i] = 2 * data[i] - data[i+4] - 0.5 * data[i+4];
            }
        }
    }

    postMessage(imagedata);
}

效果展示

postMessage

在这里插入图片描述

worker

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值