Question

J'ai eu un coup d'œil à la classe ColorSpace, et a trouvé la TYPE_HLS constante (qui sans doute est juste HSL dans un ordre différent).

Puis-je utiliser cette constante pour créer une Color de la teinte, la saturation et la luminosité? Dans le cas contraire, yat il des classes Java pour cela, ou dois-je écrire mon propre?

Était-ce utile?

La solution 6

Autres conseils

La plupart des réponses données ici semblent supposer que HSL == HSB, ce qui est faux. Le colorspace HSB est utile (et utilisé) dans de nombreux cas, mais il y a une exception notable: CSS. Les non-RGB fonctions de couleur css, HSL () et HSLA () sont HSL, pas HSB. En tant que tel, il est très utile de pouvoir convertir et de HSL en java.

Il y a un bon writeup sur le problème ici: http://tips4java.wordpress.com/ 2009/07/05 / HSL-couleur / TL ; DR: le code est ici: http: / /www.camick.com/java/source/HSLColor.java

Les méthodes qui y sont assez faciles à extraire si vous ne voulez pas utiliser la classe.

Il ne semble pas que l'auteur de la classe comprenait une licence, si le contexte du billet de blog semble impliquer le domaine public. Utilisez votre propre jugement.

EDIT: Je me rends compte HSB = HSL, la réponse ci-dessous pour HSB

.

Je ne pense pas qu'il y ait besoin d'utiliser ici colorimétriques. Essayez quelque chose comme ce qui suit:

float hue = 0.9f; //hue
float saturation = 1.0f; //saturation
float brightness = 0.8f; //brightness

Color myRGBColor = Color.getHSBColor(hue, saturation, brightness);

Voici une implémentation simple qui renverra une couleur en fonction de la teinte, la saturation et les valeurs légèreté de 0,0 à 1,0 ...

static public Color hslColor(float h, float s, float l) {
    float q, p, r, g, b;

    if (s == 0) {
        r = g = b = l; // achromatic
    } else {
        q = l < 0.5 ? (l * (1 + s)) : (l + s - l * s);
        p = 2 * l - q;
        r = hue2rgb(p, q, h + 1.0f / 3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1.0f / 3);
    }
    return new Color(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255));
}

EDIT par Yona-Appletree:

J'ai trouvé ce que je pense est la fonction hue2rgb correcte et testé comme travail:

private static float hue2rgb(float p, float q, float h) {
    if (h < 0) {
        h += 1;
    }

    if (h > 1) {
        h -= 1;
    }

    if (6 * h < 1) {
        return p + ((q - p) * 6 * h);
    }

    if (2 * h < 1) {
        return q;
    }

    if (3 * h < 2) {
        return p + ((q - p) * 6 * ((2.0f / 3.0f) - h));
    }

    return p;
}

Peut-être cette vous aidera. Le JDK ne semble pas être très utile lorsque l'on veut utiliser des couleurs dans un autre espace de couleur.

Edit: En ColorSpace.getName(idx) il y a ce petit extrait:

 case ColorSpace.TYPE_HLS:
                    compName = new String[] {"Hue", "Lightness", 
                                             "Saturation"};

il était donc ce que vous pensiez, mais en regardant la hiérarchie de type de ColorSpace il ne semble pas être utilisé ou mis en œuvre dans toute façon partout. ColorSpace est prolongée par deux autres classes BogusColorSpace et ICC_ColorSpace, donc je suppose qu'ils attendent aux développeurs de créer leurs propres implémentations pour différents espaces de couleurs.

Si votre entrée est oscillation / widgets AWT, puis avec Java 7 JColorChooser vous pouvez obtenir la couleur par le HSV et des espaces HSL. http://java.dzone.com/articles/new-color-chooser -jdk-7

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top