2016-03-29 3 views
2

Я использую Android Philips Hue SDK, и в настоящее время у меня проблема с преобразованием значения XY в лампочку RGB.Преобразование значений XY в RGB

Я просмотрел this code, предоставленный на форуме на сайте Philips Hue, и код был предоставлен кем-то из Hue Support.

У меня есть следующие функции, используя этот код из форума:

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, которое возвращается, является бледно-желтым.

Неужели кто-то еще испытал это или знает, как решить эту проблему?

ответ

1

У меня была аналогичная проблема при программировании настольного приложения с использованием того же Java SDK(требуется логин). Интересно, что простой красный цвет превратился в желтый цвет, как вы его описываете. Возможным решением является использование значений xy непосредственно вместо преобразования из значений оттенков. Это окончательно решило проблему для меня. Вы можете получить значения xy из объекта PHLightState, используя методы .getX() и .getY(). После этого используйте colorFromXY, как в вашем коде, чтобы получить значения RGB (as android color value = int).

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()}; 

Примечание: огни могут только адресовать определенную цветовую гамму в зависимости от типа. Это объясняется подробно here. «Обычные» луковицы с цветовой гаммой 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 
+1

Большое спасибо за помощь. Я не понимаю, почему у Philips нет конверсионной утилиты, так как они делают это в одном направлении, а почему бы и не вернуться обратно. бит нечетный – Boardy

Смежные вопросы