Есть несколько ошибок:
Первое: вы используете обычную формулу преобразования, где красный, зеленый и синий должны находиться в диапазоне от 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 должен знать, какая это максимальная яркость, но ... это исключение].