2

我正在使用 Android Philips Hue SDK,目前在将灯泡 XY 值转换为 RGB 时遇到问题。

我查看了飞利浦 Hue 网站论坛中提供的此代码,该代码是由 Hue 支持人员提供的。

我使用论坛中的此代码具有以下功能:

public static int[] convertXYToRGB(float[] xy, String lightModel)
    {
        int color = PHUtilities.colorFromXY(xy, lightModel);
        int r = Color.red(color);
        int g = Color.green(color);
        int b = Color.blue(color);
        return new int[] {r, g, b};
    }

我这样称呼它:

int hue = lightState.getHue();
float[] xy = PHUtilities.calculateXY(hue, item.light.getModelNumber());

int[] rgb = Utilities.convertXYToRGB(xy, item.light.getModelNumber());

看着我回来的 RGB 值,它似乎是错误的颜色。例如,使用官方应用程序,我将我的一个灯泡设置为红色。当我运行我的应用程序时,返回的 RGB 值是淡黄色。

有没有其他人经历过这个或知道如何解决这个问题?

4

1 回答 1

1

我在使用相同的Java SDK (需要登录)编写桌面应用程序时遇到了类似的问题。有趣的是,纯红色变成了淡黄色,正如你所描述的那样。一种可能的解决方案是直接使用 xy 值,而不是从色调值转换。这终于为我解决了这个问题。您可以使用和PHLightState方法从对象中获取 xy 值。之后,在代码中使用 as 来获取 RGB 值(作为 android 颜色值= )。.getX().getY()colorFromXYint

PHLightState s = light.getLastKnownLightState();

float xy[] = new float[] {s.getX(), s.getY()};
int combRGB = PHUtilities.colorFromXY(xy, light.getModelNumber());

在 Android 上,combRGB像你已经做的那样进行转换。确保包括android.graphics.Color. 如果您在非 Android 系统上进行测试,您可以使用以下代码:

Color theColor = new Color(combRGB);
int[] sepRGB = {theColor.getRed(), theColor.getGreen(), theColor.getBlue()};

注意:根据类型,灯只能处理特定的色域。这在这里详细解释。具有色域B的“普通”灯泡具有相当多的局限性。例如:大多数绿色变成黄色,蓝色含有一定量的红色。

示例值:以下整体转换是在我使用 LCT001-blubs 的实时系统上测试的。我曾经PHUtilities.calculateXYFromRGB()转换输入,然后设置新光照状态的 xy 值,.setX()最后.setY()将其发送到网桥。然后,一旦获得下一次更新,就会从应用程序的轻缓存中提取这些值。

255   0   0   ->   254   0   0
  0 255   0   ->   237 254   0
  0   0 255   ->    90   0 254
200   0 200   ->   254   0 210
255 153   0   ->   254 106   0
255 153 153   ->   254  99 125
于 2016-04-01T22:30:01.033 回答