我正在制作一个网络界面来管理我的色调灯,但在色彩处理方面我很挣扎..
灯的api为我提供了http://en.wikipedia.org/wiki/CIE_1931_color_space
的x和y坐标但不是z值。
我想我必须从亮度值或饱和度值(0到255)计算z。
但我对颜色和数学非常糟糕:p。
我尝试使用函数https://github.com/eikeon/hue-color-converter/blob/master/colorconverter.ts
但正如我在评论中所看到的,这些功能并没有提供正确的值...
有人可以帮助我吗? ☺
ps:我需要一个javascript函数。
答案 0 :(得分:9)
好的,所以我设法在How do I convert an RGB value to a XY value for the Phillips Hue Bulb
的帮助下开展工作function xyBriToRgb(x, y, bri){
z = 1.0 - x - y;
Y = bri / 255.0; // Brightness of lamp
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) * Math.pow(r, (1.0 / 2.4)) - 0.055;
g = g <= 0.0031308 ? 12.92 * g : (1.0 + 0.055) * Math.pow(g, (1.0 / 2.4)) - 0.055;
b = b <= 0.0031308 ? 12.92 * b : (1.0 + 0.055) * Math.pow(b, (1.0 / 2.4)) - 0.055;
maxValue = Math.max(r,g,b);
r /= maxValue;
g /= maxValue;
b /= maxValue;
r = r * 255; if (r < 0) { r = 255 };
g = g * 255; if (g < 0) { g = 255 };
b = b * 255; if (b < 0) { b = 255 };
return {
r :r,
g :g,
b :b
}
}
它不是很精确,但效果很好。如果有人设法做出更好的事情,请在此发布,谢谢。
答案 1 :(得分:2)
我修改了你的脚本,以HEX表示法返回rgb值:
function xyBriToRgb(x, y, bri)
{
z = 1.0 - x - y;
Y = bri / 255.0; // Brightness of lamp
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) * Math.pow(r, (1.0 / 2.4)) - 0.055;
g = g <= 0.0031308 ? 12.92 * g : (1.0 + 0.055) * Math.pow(g, (1.0 / 2.4)) - 0.055;
b = b <= 0.0031308 ? 12.92 * b : (1.0 + 0.055) * Math.pow(b, (1.0 / 2.4)) - 0.055;
maxValue = Math.max(r,g,b);
r /= maxValue;
g /= maxValue;
b /= maxValue;
r = r * 255; if (r < 0) { r = 255 };
g = g * 255; if (g < 0) { g = 255 };
b = b * 255; if (b < 0) { b = 255 };
r = Math.round(r).toString(16);
g = Math.round(g).toString(16);
b = Math.round(b).toString(16);
if (r.length < 2)
r="0"+r;
if (g.length < 2)
g="0"+g;
if (b.length < 2)
b="0"+r;
rgb = "#"+r+g+b;
return rgb;
}
alert(xyBriToRgb(0.5052,0.4151, 254));
我制作了一个PHP版本:
function xyBriToRgb($x,$y,$bri)
{
$z = 1.0 - $x - $y;
$Y = $bri / 255.0;
$X = ($Y / $y) * $x;
$Z = ($Y / $y) * $z;
$r = $X * 1.612 - $Y * 0.203 - $Z * 0.302;
$g = ($X * -1) * 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;
$maxValue = max( $r , $g, $b );
$r = $r / $maxValue;
$g = $g / $maxValue;
$b = $b / $maxValue;
$r = $r * 255; if ($r < 0) $r = 255;
$g = $g * 255; if ($g < 0) $g = 255;
$b = $b * 255; if ($b < 0) $b = 255;
$r = dechex(round($r));
$g = dechex(round($g));
$b = dechex(round($b));
if (strlen($r) < 2) $r = "0" + $r;
if (strlen($g) < 2) $g = "0" + $g;
if (strlen($b) < 2) $b = "0" + $b;
return "#".$r.$g.$b;
}
print xyBriToRgb(0.5052,0.4151, 254);
祝大家快乐编码: - )
答案 2 :(得分:0)
最后应该是
r = Math.round(r * 255); if (r < 0) { r = 0; }
g = Math.round(g * 255); if (g < 0) { g = 0; }
b = Math.round(b * 255); if (b < 0) { b = 0; }
如果r
,g
或b
小于0,是不是应该是0而不是255?我测试过的颜色更有意义。
谢谢你的配方!