HTML5 Canvas:更改图像颜色

时间:2014-06-25 09:42:25

标签: javascript css html5 canvas html5-canvas

我有一个图像(灰度形式),我想要更改颜色(特定于用户)。由于很难改变灰度图像的颜色,我采用了一种方法。

图像分为两部分。

  1. 一个是白色的图像。
  2. 第二,具有灰度的半透明图像。
  3. 现在,我将两个图像放在彼此的顶部(下面是白色图像,顶部是灰度图像),这样当我改变白色图像的颜色时,用户就可以看到它。

    问题:这个方法适用于我,除了一个问题。当我为白色图像着色时,它将从角落像素化。

    JSFiddle:http://jsfiddle.net/pandey_mohit/BeSwL/

    JSFiddle包含三个胶囊图像:

    1. 顶部胶囊部分白色图像(用于着色)
    2. 底部胶囊部分白色图像(用于着色)
    3. 3D效果的半透明图像(使用灰度)
    4. 选择红色,绿色或蓝色以查看问题。

      function hexToRgb(color) {
          var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
          color = color.replace(shorthandRegex, function(m, r, g, b) {
              return r + r + g + g + b + b;
          });
      
          var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
          return result ? {
              r: parseInt(result[1], 16),
              g: parseInt(result[2], 16),
              b: parseInt(result[3], 16)
          } : {
              r: 0,
              g: 0,
              b: 0
          };
      }
      
      function colorImage(imgId,hexaColor) {
          // create hidden canvas (using image dimensions)
          var imgElement = document.getElementById(imgId);
      
          var canvas = document.createElement("canvas");
          canvas.width = imgElement.width;
          canvas.height = imgElement.height;
      
          var ctx = canvas.getContext("2d");
          ctx.drawImage(imgElement,0,0);
      
          var imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
      
          var data = imageData.data;
      
          // convert image to grayscale
          var rgbColor = hexToRgb(hexaColor);
      
          for(var p = 0, len = data.length; p < len; p+=4) {
              if(data[p+3] == 0)
                 continue;
              data[p + 0] = rgbColor.r;
              data[p + 1] = rgbColor.g;
              data[p + 2] = rgbColor.b;
              data[p + 3] = 255;
          }
          ctx.putImageData(imageData, 0, 0);
      
          // replace image source with canvas data
          imgElement.src = canvas.toDataURL();
      }
      
      // changing color of capsule on select event
      document.getElementById('sel_top').onchange = function(){
          colorImage('img_top', this.value);
      }
      document.getElementById('sel_bottom').onchange = function(){
          colorImage('img_bottom', this.value);
      }
      

1 个答案:

答案 0 :(得分:8)

您的重新着色算法将每个RGBA四重奏的第4个字节设置为255,这会丢弃叠加层的Alpha通道并打破图像边缘周围的抗锯齿。保持原始的alpha通道可以获得更好的结果:

for(var p = 0, len = data.length; p < len; p+=4) {
    data[p + 0] = rgbColor.r;
    data[p + 1] = rgbColor.g;
    data[p + 2] = rgbColor.b;
}

JSFiddle with the lines commented out