RGB à Philips Hue (HSB)
Je suis en train de faire un musicplayer en Traitement pour un travail pour l'école. Le Philips Hue lumières de certains correspondants des effets visuels.
Je voulais faire les visuels plutôt unique pour chaque chanson.
J'ai donc récupéré l'art de couverture (à l'aide de LastFM API) de la lecture de la piste pour obtenir la plus fréquente de la couleur et de l'utiliser comme base pour créer les autres couleurs.
Le Philips Hue a une autre façon de montrer les couleurs à savoir (HSB). J'ai donc converti via
Color.RGBtoHSB();
Pour ex. il me donne pour R= 127, G=190, B=208 les valeurs H= 0.5370371, S=0.38942307, B=0.8156863. Maintenant, je devine qu'ils ont été calculés sur la base de 1 j'ai donc multiplié la Luminosité fr Saturation de 255. Et la Teinte par 65535.
(Comme on le voit sur http://developers.meethue.com/1_lightsapi.html)
Lors de la définition de ces valeurs calculées dans les Philips Hue n'importe quelle chanson joue la couleur est toujours rouges ou blancs.
Fait quelque chose de mal se passer avec la conversion entre RVB à HSB?
Sur la demande de mon code:
Comme un test:
Color c = Colorconverter.getMostCommonColour("urltoimage");
float[] f = Colorconverter.getRGBtoHSB(c);
ArrayList<Lamp> myLamps = PhilipsHue.getInstance().getMyLamps();
State state = new State();
state.setBri((int) Math.ceil(f[2]*255));
state.setSat((int) Math.ceil(f[1]*255));
state.setHue((int) Math.ceil(f[0]*65535));
state.setOn(true);
PhilipsHue.setState(myLamps.get(1), state);
Les fonctions comme indiqué ci-dessus
public static Color getMostCommonColour(String coverArtURL) {
Color coulourHex = null;
try {
BufferedImage image = ImageIO.read(new URL(coverArtURL));
int height = image.getHeight();
int width = image.getWidth();
Map m = new HashMap();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgb = image.getRGB(i, j);
int[] rgbArr = getRGBArr(rgb);
//No grays ...
if (!isGray(rgbArr)) {
Integer counter = (Integer) m.get(rgb);
if (counter == null) {
counter = 0;
}
counter++;
m.put(rgb, counter);
}
}
}
coulourHex = getMostCommonColour(m);
System.out.println(coulourHex);
} catch (IOException e) {
e.printStackTrace();
}
return coulourHex;
}
private static Color getMostCommonColour(Map map) {
List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {
public int compare(Object o1, Object o2) {
return ((Comparable) ((Map.Entry) (o1)).getValue())
.compareTo(((Map.Entry) (o2)).getValue());
}
});
Map.Entry me = (Map.Entry) list.get(list.size() - 1);
int[] rgb = getRGBArr((Integer) me.getKey());
String r = Integer.toHexString(rgb[0]);
String g = Integer.toHexString(rgb[1]);
String b = Integer.toHexString(rgb[2]);
Color c = new Color(rgb[0], rgb[1], rgb[2]);
return c;
}
private static int[] getRGBArr(int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
return new int[] { red, green, blue };
}
private static boolean isGray(int[] rgbArr) {
int rgDiff = rgbArr[0] - rgbArr[1];
int rbDiff = rgbArr[0] - rgbArr[2];
//Filter out black, white and grays...... (tolerance within 10 pixels)
int tolerance = 10;
if (rgDiff > tolerance || rgDiff < -tolerance)
if (rbDiff > tolerance || rbDiff < -tolerance) {
return false;
}
return true;
}
public static float[] getRGBtoHSB(Color c) {
float[] hsv = new float[3];
return Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), hsv);
}
L'ensemble de l'état tout simplement une simple mise à l'philips ampoules. Quand je vérifie le JSON de l'ampoule
{
"state": {
"on": true,
"bri": 81,
"hue": 34277,
"sat": 18,
"xy": [
0.298,
0.2471
],
"ct": 153,
"alert": "none",
"effect": "none",
"colormode": "hs",
"reachable": true
},
"type": "Extended color light",
"name": "Hue Spot 1",
"modelid": "LCT003",
"swversion": "66010732",
"pointsymbol": {
"1": "none",
"2": "none",
"3": "none",
"4": "none",
"5": "none",
"6": "none",
"7": "none",
"8": "none"
}
}
source d'informationauteur tim
Vous devez vous connecter pour publier un commentaire.
Un merci spécial à StackOverflow utilisateur, Gee858eeG, à mon avis faute de frappe et Erickson pour les bons conseils et liens.
Ici est un travail de la fonction de convertir n'importe quelle couleur RVB pour un Philips Hue valeurs XY. La liste renvoyée contient seulement deux d'élément 0 X, 1 étant Y.
Le code est basé sur cette brillante remarque: https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX/commit/f41091cf671e13fe8c32fcced12604cd31cceaf3
Mêmela pensée ce n'est pas revenir à l'HSB valeur les valeurs XY peut être utilisé comme un remplacement pour le changement de couleurs sur la Teinte.Espérons que cela peut être utile pour d'autres personnes, parce que Philips API ne parle pas de n'importe quelle formule.
Je pense que le problème ici est que le La teinte a une jolie gamme de couleurs limitée. C'est du lourd sur les rouges et les violets, mais ne peut pas produire autant de saturation dans le bleu-vert de la région..
Je suggère de réglage de la saturation au maximum, 255, et ne varient que de la teinte.
Basé sur le tableau donné dans la documentation, la Teinte de la "nuance" attribut ne correspondent pas directement à HSV de la teinte. Le rapprochement pourrait être assez proche, mais si pas, il peut être intéressant d'essayer un la conversion à l'espace colorimétrique CIE 1931, et puis définissez le "xy" attribut au lieu de la teinte.
Votre RVB, TSL doit être 193 degrés, 39% et 82% respectivement. Donc, à tout le moins, S et B semblent corrects. En regardant les Philips hue documentation de l'API, vous faites la bonne chose en multipliant ces chiffres par 255.
Pour obtenir la valeur H en degrés, multipliez la valeur calculée valeur H de la 360. C'est la façon dont vous arrivez à l'193 dans votre cas. Une fois que vous avez les degrés, vous multipliez par 182 pour obtenir la valeur de ce que vous devriez envoyer le Philips hue de l'API (à partir de Hack de la Teinte):
Cela devrait vous donner différentes valeurs de H que vous êtes l'obtention de la
* 65535
méthode.