2013-04-17 78 views
3

Philips Hue API在某些情況下爲blub的顏色值返回xy值。我怎樣才能將其轉換爲HEX字符串?我嘗試了各種公式,我在網上找到,但沒有一個可以在燈泡的所有顏色上工作。將Philips Hue XY值轉換爲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; 

我把我的燈一個在底部的紅色色調的應用程序留下的顏色選擇器並將亮度設置爲最大。以下是所產生的值:

// 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 

正如你所看到的,所產生的r值超出了範圍,因爲它比1.我在我的公式缺少高?

+0

我們也移植的例子的代碼來重新調整所有顏色值:HTTPS: //github.com/PhilipsHue/PhilipsHueSDKiOS/blob/master/ApplicationDesignNotes/RGB%20to%20xy%20Color%20conversion.md從Objective-C到Javascript,所以我們很快就會發布。更新:Javascript/Typescript實現現在在線:https://github.com/Q42/hue-color-converter – Christiaan

+0

我看了看指南,並添加了一些示例代碼,原來的問題,我仍然無法得到它工作。我的RGB顏色最終超出範圍。 – Cowlby

回答

5

正如您所見,生成的r值超出範圍,因爲它高於1.我在等式中缺少什麼?

飛利浦色調API返回的xy值爲CIE 1931 color space。該色彩空間指示人眼可見的所有色彩。由於該色彩空間大於您的設備可以顯示的色彩空間,因此並非所有色彩都與設備色彩空間內的色彩相匹配。

例如,如果您假設設備的顏色能力爲sRGB,則色域外的所有顏色都會導致R,G和/或B的負值。解決此問題時,您必須將這些顏色映射爲可顯示的顏色色域。最簡單的選擇是將所有值設置爲0,如果它們是負值。

也可能出現大於1的值。對於這個問題,最簡單的解決方法是相同的因子,使一切都小於1。簡單的方法是像

$maxValue = max($r,$g,$b); 
$r /= $maxValue; 
$g /= $maxValue; 
$b /= $maxValue;