3

Philips Hue API は、ブラブの色の値に対して特定のケースで 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;

Hue アプリのカラー ピッカーの左下にある赤にライトの 1 つを設定し、明るさを最大に設定しました。結果の値は次のとおりです。

// 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 より大きいため、範囲外です。数式で何が欠けていますか?

4

2 に答える 2

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;
于 2013-04-24T09:07:21.907 に答える