canvas图片换色(转加自我总结)

4,974 阅读2分钟

最近有一个需求说是需要换图片颜色。

最后其实给我拒绝了,因为我说很难实现。但是心中还是上心了。

下面是替换颜色的方法。效果还行吧。一般般

主要代码还是copy别人的。这里就写一下,当记录

1、canvas的getImageData所生成的图片组成

根据循环可以得出

图片组成是ARGB格式,第一个是透明度,后续rgba

2、得出的图片循环需要按4的倍数进行循环,否则至少是卡死的地步

for (var j = 0; j < pdata.length; j+=4) {
  if (pdata[j] === 95) pdata[j] = colorArr[0];
  if (pdata[j - 1] === 170) pdata[j-1] = colorArr[1];
  if (pdata[j - 2j] === 129) pdata[j-2] = colorArr[2];
}

3、注意替换颜色应该是倒序

所以0,1,2,3的顺序

替换的rgb颜色应该是3,2,1

得到数组rgb:data[i],data[i-1],data[2]

替换方式看上面代码

4、完整代码格式

<!DOCTYPE html>
<html>
<style>
  #btn {
    width: 100px;
    height: 50px;
    background: coral;
    position: fixed;
    top: 0;
  }
</style>
<head>
  <script type="text/javascript">
    var c, ctx,myImage;
    function displayImage() {
      myImage = new Image();
      myImage.src = "1719ebbc83be39f0.webp.jpg";
      c = document.getElementById("myCanvas");
      if (c.getContext) {
        ctx = c.getContext("2d");
        myImage.onload = function() {
          ctx.drawImage(myImage, 0, 0);
        }
      }
    }
    //colorArr 替换后的颜色
    // 替换前的颜色
    function getColorData(colorArr, color2) {
      imageD = ctx.getImageData(0, 0, myImage.width, myImage.height);
      var pdata = imageD.data;
      for (var j = 0; j < pdata.length; j+=4) {
        if (pdata[j] === color2[0]) pdata[j] = colorArr[0];
        if (pdata[j + 1] === color2[1]) pdata[j + 1] = colorArr[1];
        if (pdata[j + 2] === color2[2]) pdata[j + 2] = colorArr[2];
      }
      ctx.putImageData(imageD, 0, 0);
    }

    function colorChange() {
      // rgb颜色
      getColorData([102, 51, 153], [95, 170, 129]);
    }

  </script>
</head>
<body onload="displayImage()">
<p>原始图片:</p>
<img id="myPhoto" src="1719ebbc83be39f0.webp.jpg">
<p>Canvas图片:</p>
<canvas id="myCanvas" width="200" height="200"></canvas>
<button id="btn" onclick="colorChange()">变颜色啦!</button>
</body>
</html>