преобразовать цвет RGB в XY - PullRequest
0 голосов
/ 13 февраля 2019

Я использую RUCKUS API для изменения цвета лампы, и мне нужно преобразовать цвет из RGB в XY для вызова API.

Я пробовал этот код:

1) Получите значения RGB из вашего цветового объекта и преобразуйте их в значение от 0 до 1

 function rgb_to_cie(red, green, blue)
    {
        //Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device
        var red     = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
        var green   = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
        var blue    = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92); 

        //RGB values to XYZ using the Wide RGB D65 conversion formula
        var X       = red * 0.664511 + green * 0.154324 + blue * 0.162028;
        var Y       = red * 0.283881 + green * 0.668433 + blue * 0.047685;
        var Z       = red * 0.000088 + green * 0.072310 + blue * 0.986039;

        //Calculate the xy values from the XYZ values
        var x       = (X / (X + Y + Z)).toFixed(4);
        var y       = (Y / (X + Y + Z)).toFixed(4);

        if (isNaN(x))
            x = 0;
        if (isNaN(y))
            y = 0;   
        return [x, y];
    }

, но это не обеспечило правильного решения.

ТАК, если я передам r: 182 г: 255 B: 65 так как тогда я получил x как 22932 и y как 35249 (согласно API.)

Как я могу это сделать?

1 Ответ

0 голосов
/ 13 февраля 2019

Есть несколько ошибок:

Первое: вы используете обычную формулу преобразования, где красный, зеленый и синий должны находиться в диапазоне от 0,0 до 1,0.Поэтому вам может понадобиться разделить значения на 255.

Второе: вы применяете гамму.Для преобразования в X, Y, Z вам нужны линейные значения.Обычно у нас есть гамма-коррекция RGB (например, значения пикселей).Таким образом, вы слишком корректируете.Вместо этого вы должны применить обратную гамму, чтобы вы получили линейные R, G, B, чтобы вы могли применить линейное преобразование для получения X, Y, Z.

В-третьих: вы возвращаете x, у, а не X, Y, как ваш вопрос (и комментарий).С другой стороны, ты уверен, что тебе нужен X, Y?Часто х, у используются для «цвета».Я ожидаю, что топор, y + Y (или некоторый параметр яркости).

Возможно, вам следует уменьшить значения.Как видите, часто диапазон составляет от 0 до 1, или от 0 до 100 (в прошлом), или от 0 до 255, от 0 до 65535. Стандартов нет: это просто числа без единицы.[В отличие от экранов компьютеров, Phillips Hue должен знать, какая это максимальная яркость, но ... это исключение].

...