canvas实现图像颜色反转、图像灰度化

已被阅读 2337 次 | 文章分类:javascript | 2019-03-01 19:57

常用的图片优化及处理软件,都会有图像滤镜效果,本文介绍通过javascript canvas实现颜色反转、及灰度化处理的效果

一:实现原理

图像滤效果的体现,本质是对图像像素值的处理,获取到每一图像的所有像素值,然后加以处理,就可以得到我们想要的所有效果

canvas提供了context.getImageData()方法,得到的是一个一维数组:类似[RGBARGBARGBARGBA...];每四个值凑成了对应像素的rgba值,所以可以对此做相关处理,然后通过context.putImageData()方法,写入得到想要的滤镜效果

二:颜色反转

反转颜色的核心算法部分是获取一个像素点RGB值r, g, b则新的RGB值为(255-r, 255-g, 255-b),通过以下公式计算新值

                                            
nr = 255 - r;
ng = 255 - g;
nb = 255 - b;
a= 255;
                                            
                                        

核心代码如下

                                            
let image = document.getElementById('img');
image.onload = function () {
    let canvas = document.getElementById('ResultCanvas'),
        context = canvas.getContext('2d'),
        width = canvas.width = image.width,
        height = canvas.height = image.height;
    context.drawImage(image, 0, 0, width, height);
    let canvasData = context.getImageData(0, 0, canvas.width, canvas.height);
    for (let x = 0; x < canvasData.width; x++) {
        for (let y = 0; y < canvasData.height; y++) {
            var idx = (x + y * canvasData.width) * 4;
            // 图像颜色反转 
            canvasData.data[idx + 0] = 255 - canvasData.data[idx + 0];
            canvasData.data[idx + 1] = 255 - canvasData.data[idx + 1];
            canvasData.data[idx + 2] = 255 - canvasData.data[idx + 2];
            canvasData.data[idx + 3] = 255;
        }
    }
    context.putImageData(canvasData, 0, 0);
}
                                            
                                        

比对效果:

/net/upload/image/20190301/6371082877416693604174654.png

三:图像灰度化

1、彩色转灰度,在这里用到著名的心理学公式

                                            
Gray = R*0.299 + G*0.587 + B*0.114
                                            
                                        

2、核心代码如下:

                                            
let r = canvasData.data[idx + 0];
let g = canvasData.data[idx + 1];
let b = canvasData.data[idx + 2];
let gray = .299 * r + .587 * g + .114 * b;
canvasData.data[idx + 0] = gray;
canvasData.data[idx + 1] = gray;
canvasData.data[idx + 2] = gray;
canvasData.data[idx + 3] = 255;
                                            
                                        

比对效果

/net/upload/image/20190301/6371082907704816099277969.png

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号