5

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

我可以得到画布imageDatavar imageData = canvas.getImageData(0, 0, 200, 200);

但是该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等等

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

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

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

4

2 回答 2

3

我不确定您是否仍在寻找答案,因为这是很久以前提出的问题。但我试图做同样的事情并遇到了为什么这个 Javascript RGB 到 HSL 代码不起作用的答案?,这应该可以解决问题:

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) + '%)';

}
于 2017-11-28T22:48:36.153 回答
1

你可以写一个像这样简单的

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;
}

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

我希望这有帮助!

于 2014-05-29T16:14:33.040 回答