将Philips Hue XY值转换为HEX

Cow*_*lby 3 philips-hue

飞利浦Hue API在某些情况下会返回一个xy值,用于blub的颜色值.如何将其转换为HEX字符串?我尝试过在网上找到的各种配方,但它们都不适用于灯泡的所有颜色.

我看了下面建议的指南,并尝试在PHP中实现如下:

list($x, $y) = $light['state']['xy'];
$z = 1.0 - $x - $y;
$Y = $light['state']['bri'] / 255.0; // The given brightness value
$X = ($Y / $y) * $x;
$Z = ($Y / $y) * $z;

$r = $X * 1.612 - $Y * 0.203 - $Z * 0.302;
$g = -$X * 0.509 + $Y * 1.412 + $Z * 0.066;
$b = $X * 0.026 - $Y * 0.072 + $Z * 0.962;

$r = $r <= 0.0031308 ? 12.92 * $r : (1.0 + 0.055) * pow($r, (1.0 / 2.4)) - 0.055;
$g = $g <= 0.0031308 ? 12.92 * $g : (1.0 + 0.055) * pow($g, (1.0 / 2.4)) - 0.055;
$b = $b <= 0.0031308 ? 12.92 * $b : (1.0 + 0.055) * pow($b, (1.0 / 2.4)) - 0.055;
Run Code Online (Sandbox Code Playgroud)

我将我的一个灯光设置为Hue应用程序中颜色选择器左下角的红色,并将亮度设置为最大值.以下是结果值:

// Read from bulb
x = 0.6472
y = 0.3302
bri = 254

// XYZ calculations
X = 1.952
Y = 0.996
Z = 0.068

// RGB calculations
r = 1.594 // Out-of-range > 1
g = 0.677
b = 0.233
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,生成的r值超出范围,因为它高于1.我的方程式中缺少什么?

Tob*_*ler 6

正如您所看到的,生成的r值超出范围,因为它高于1.我的方程式中缺少什么?

Philips hue API返回的xy值在CIE 1931色彩空间中.该颜色空间索引人眼可见的所有颜色.由于此颜色空间大于设备可以显示的颜色空间,因此并非所有颜色都可以映射到设备颜色空间内的颜色.

例如,如果你认为设备的颜色能力,sRGB的则色域之外的所有颜色将导致用于R,G和/或B的负值解决这一点,必须这些颜色映射到色域内的可显示颜色.最简单的选择是将所有值设置为0(如果它们是负数).

也可以显示大于1的值.解决此问题的最简单方法是将所有颜色值重新调整为相同因子,以便一切都小于1.一个简单的方法就是这样的

$maxValue = max($r,$g,$b);
$r /= $maxValue;
$g /= $maxValue;
$b /= $maxValue;
Run Code Online (Sandbox Code Playgroud)