Почему не делает этого RGB JavaScript к работе кода HSL?

Я нашел этот RGB к сценарию HSL по http://www.mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript. Я не могу найти никакие другие маленькие достойные. Проблема - то, что этот код даже действительно не работает. Кто-либо знал бы почему? (Я не знаю немного цветной математики, но возможно она возвращает дополнительное?)

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 [h, s, l];
}

Править: когда я работаю rgbToHsl(126,210,22) это дает мне [.24.81.45], который является HSL для оранжевого цвета.

13
задан Matchu 27 February 2010 в 19:32
поделиться

1 ответ

Полученный массив HSV должен быть интерпретирован как три дроби. В некоторых программах, если вы хотите выразить HSV в виде целых чисел, вы умножаете значение "H" на 360, а значения "S" и "V" на 100. Значение HSV, которое вы привели для зеленого оттенка RGB[126, 210, 22] - это HSV [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)];
}

[edit] при этом она все равно выдает мне что-то с яркостью ("L" или "V"), которая значительно слишком темная; Gimp говорит, что значение HSV должно быть [90, 80, 82], или в дробном выражении [.20, .80, .82].

[другая правка] ну одна из проблем может быть в том, что HSL и HSV - это разные схемы... все еще ищу.

OK на случай, если кому-то нужно преобразование 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];
}
23
ответ дан 1 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: