JS前端改变图片颜色

JS前端改变图片颜色

有个功能需求,产品的一键换肤功能,需要在前端实现对图片ico颜色的更改,在之前我只想到三个方法:

1.该图片每个颜色下都制作一套图片组出来(太费时 太笨了 pass)

2.制作svg出来,只需更改svg源码里的color即可(不是美工 不擅长svg的编辑 svg图片后期要修改的话完全不会 pass)

3.全部的图ico改成白色,ico背景用div,去改变div的颜色就能实现类似”一键换肤”的效果(整体效果出来很丑 还是不行 pass)

 

OK,那就只能硬上了。经过度娘谷歌无数篇文章的翻阅,和CV的尝试,总结出该函数:

/**
 *
 * @param imgUrl 可传入图片URL 或者 Base64
 * @param toRGBArr 要换成的目标颜色RGB 数组格式[R,G,B]
 */
function myFun(imgUrl, toRGBArr) {
    let image = new Image();
    image.src = imgUrl;
    image.onload = function () {
        let newCanvas = document.createElement("canvas");
        let ctx = newCanvas.getContext("2d");

        newCanvas.width = image.width;
        newCanvas.height = image.height;

        ctx.drawImage(image, 0, 0, image.width, image.height);

        let imageData = ctx.getImageData(0, 0, newCanvas.width, newCanvas.height);
        //imageData 则为图片内每个像素点的RGB信息
        for (let p = 0; p < imageData.data.length; p += 4) {
            if (imageData.data[p + 3] !== 0) {
                //判断当前像素点的A值不为0 (RGBA A为透明度) 则替换成目标颜色
                imageData.data[p] = toRGBArr[0];
                imageData.data[p + 1] = toRGBArr[1];
                imageData.data[p + 2] = toRGBArr[2];
            }
        }
        ctx.putImageData(imageData, 0, 0);

        const dataUri = newCanvas.toDataURL("image/png");

        ctx.clearRect(0, 0, image.width, image.height);
        // console.log(dataUri);

    }
}

该函数仅对简单线条的图有效,复杂颜色和复杂线条组合的图无法适用,且线条必须干净,不能有过渡边 毛边。看下效果图:

OK 效果完美,又是被JS强大功能震撼的一天


参考链接:

https://blog.csdn.net/Highning0007/article/details/108666770

发表评论

邮箱地址不会被公开。 必填项已用*标注