Полученный массив HSV должен интерпретироваться как три дроби. В некоторых программах, если вы хотите выразить HSV в виде целых чисел, вы умножаете значение «H» на 360, а значения «S» и «V» на 100. Значение HSV, указанное вами для RGB зеленого оттенка [126, 210, 22] - ВПГ [87, 81, 45] в целых числах. Вы можете изменить функцию, чтобы она возвращала такие целые числа, если вы хотите:
function rgbToHsl(r, g, b){
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), 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 [Math.floor(h * 360), Math.floor(s * 100), Math.floor(l * 100)];
}
[править], который сказал, что он все еще дает мне что-то с яркостью ("L" или "V"), что слишком темно; Гимп говорит, что значение ВПГ должно быть [90, 80, 82] или в дробных значениях [.20, .80, .82].
[другое редактирование] хорошо, одна проблема может заключаться в том, что HSL и HSV - это разные схемы ... все еще оглядываясь вокруг.
ОК, если кто-то хочет, чтобы RGB переходил на HSV (как, например, вы увидите в Gimp), вот вариант этого:
function rgbToHsv(r, g, b) {
var
min = Math.min(r, g, b),
max = Math.max(r, g, b),
delta = max - min,
h, s, v = max;
v = Math.floor(max / 255 * 100);
if ( max != 0 )
s = Math.floor(delta / max * 100);
else {
// black
return [0, 0, 0];
}
if( r == max )
h = ( g - b ) / delta; // between yellow & magenta
else if( g == max )
h = 2 + ( b - r ) / delta; // between cyan & yellow
else
h = 4 + ( r - g ) / delta; // between magenta & cyan
h = Math.floor(h * 60); // degrees
if( h < 0 ) h += 360;
return [h, s, v];
}