【问题标题】:Changing pixel in canvas imageData to hsl(60, 100%, 50%)将画布 imageData 中的像素更改为 hsl(60, 100%, 50%)
【发布时间】:2012-08-21 19:27:36
【问题描述】:

我想将HTML5 canvas 的像素更改为hsl 值。它可以是用户选择的任何hsl 值。

我可以通过var imageData = canvas.getImageData(0, 0, 200, 200);获取画布imageData

但是imageData.data 数组包含rgba 中的值。实际上数组中的每个值都是一个字节,所以 -

data[0] = r, data[1] = b, data[2] = g, data[3] = a, data[4] = r, data[5] = b, data[6] = g, data[7] = a

是否有可用于操作 imageData 的api?一个api 将抽象原始数据,以便-data[0] = rgba, data[1] = rgba 等?

这可能有类似的方法 - data[0].setValueHSL(60, 100%, 50%);

如果此 api 不存在,是否有可以创建/表示 hsl 值并将该值转换为 rgb 的类?

【问题讨论】:

    标签: javascript html5-canvas


    【解决方案1】:

    我不确定您是否仍在寻找答案,因为这是很久以前提出的问题。但我试图做同样的事情并在Why doesn't this Javascript RGB to HSL code work? 上遇到了答案,这应该可以解决问题:

    function rgbToHsl(r, g, b) {
        r /= 255, g /= 255, b /= 255;
    
        var max = Math.max(r, g, b);
        var min = Math.min(r, g, b);
        var h, s, l = (max + min) / 2;
    
        if (max == min) {
            h = s = 0; // achromatic
        } else {
            var d = max - min;
            s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
            switch(max) {
                case r: h = (g - b) / d + (g < b ? 6 : 0); break;
                case g: h = (b - r) / d + 2; break;
                case b: h = (r - g) / d + 4; break;
            }
            h /= 6;
        }
    
        return 'hsl(' + Math.floor(h * 360) + ',' + Math.floor(s * 100) + '%,' + Math.floor(l * 100) + '%)';
    
    }
    

    【讨论】:

      【解决方案2】:

      你可以写一个就这么简单

      parseImageData = function(imageData) {
          var newImageData = [];
          for ( var i = imageData - 1; i>0; i-4) {
              newImageData.push([ imageData[i],
                                  imageData[i-1],
                                  imageData[i-2],
                                  imageData[i-3] ]);
          }
          return newImageData;
      }
      

      如果你想把它转换回来

      parseNewImageData = function ( newImageData ) {
          var imageData = [];
          for ( var i = newImageData - 1; i>=0; --i) {
              imageData.push( imageData[i][0] );
              imageData.push( imageData[i][1] );
              imageData.push( imageData[i][2] );
              imageData.push( imageData[i][3] );
          }
          return imageData;
      }
      

      超级简单,你可以让它做你需要做的事情!

      我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        相关资源
        最近更新 更多