2010-06-08 5 views
14

J'ai jeté un oeil à la classe ColorSpace, et trouvé la constante TYPE_HLS (vraisemblablement est juste HSL dans un ordre différent). Puis-je utiliser cette constante pour créer un Color à partir de la teinte, de la saturation et de la luminosité? Sinon, existe-t-il des classes Java pour cela, ou dois-je écrire le mien?Comment utiliser l'espace de couleurs HSL en Java?

+0

Le « top » réponse donnée ci-dessous est faux. HSB n'est pas la même chose que HSL. Vous finirez par obtenir beaucoup de couleurs plus sombres que prévu. J'ai ajouté un exemple d'implémentation de HLS (HSL) ci-dessous. – xtempore

Répondre

-1
+6

Eh bien, HSB n'est pas exactement le même que HSL. –

+2

par exemple. 'Color.getHSBColor (0, 1, 1)' retournerait la couleur en rouge, mais si vous vouliez la couleur pour (H = 0, S = 1, L = 1) vous devriez obtenir du blanc. –

+0

@Andrei: En effet. http://en.wikipedia.org/wiki/HSL_and_HSV: "HSV représente la teinte, la saturation et la valeur, et est également souvent appelé HSB (B pour la luminosité)." – JAB

1

Peut-être this aidera. Le JDK ne semble pas très utile lorsque vous souhaitez utiliser des couleurs dans un autre espace colorimétrique.

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

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

il était ce que vous pensiez, mais en regardant la hiérarchie de type de ColorSpace il ne semble pas être utilisé ou mis en œuvre de quelque manière que partout. ColorSpace est étendu par seulement deux autres classes BogusColorSpace et ICC_ColorSpace, donc je suppose qu'ils attendent des développeurs qu'ils créent leurs propres implémentations pour différents espaces de couleurs.

9

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

Je ne pense pas qu'il soit nécessaire d'utiliser ColorSpaces ici. 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); 
+6

Notez que le B est réellement" luminosité ", pas luminosité/légèreté, et est un autre terme pour l'attribut" valeur "de l'espace de couleur HSV – JAB

+1

Je devais donner un downvote parce que HSB! = HLS – Supuhstar

9

La plupart des réponses données semblent supposer que HSL == HSB, ce qui est faux. L'espace de couleurs HSB est utile (et utilisé) dans de nombreux cas, mais il existe une exception notable: CSS. Les fonctions de couleur CSS non-RVB, hsl() et hsla() sont HSL, pas HSB. En tant que tel, il est très utile de pouvoir convertir vers et depuis HSL en java.

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

Les méthodes sont assez faciles à extraire celui-ci si vous ne voulez pas utiliser toute la classe.

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

4

Voici une implémentation simple qui renverra une couleur en fonction de la teinte, la saturation et les valeurs de luminosité 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)); 
} 
+4

Cette réponse est inutile sans 'hue2rgb'. – Supuhstar

Questions connexes