2010-06-08 10 views
14

Ich habe mir die ColorSpace-Klasse angesehen und die Konstante TYPE_HLS gefunden (die vermutlich ist nur HSL in einer anderen Reihenfolge).Wie kann ich den HSL-Farbraum in Java verwenden?

Kann ich diese Konstante verwenden, um eine Color aus Farbton, Sättigung und Leuchtkraft zu erstellen? Wenn nicht, gibt es dafür Java-Klassen oder muss ich meine eigenen schreiben?

+0

Die „top“ Antwort gegeben unten ist FALSCH zurück. HSB ist nicht dasselbe wie HSL. Sie werden am Ende viel dunklere Farben bekommen, als Sie erwarten. Ich habe unten eine Beispielimplementierung von HLS (HSL) hinzugefügt. – xtempore

Antwort

-1
+6

Nun, HSB ist nicht genau das gleiche wie HSL. –

+2

z.B. 'Color.getHSBColor (0, 1, 1)' würde die Farbe Rot zurückgeben, aber wenn Sie die Farbe für (H = 0, S = 1, L = 1) möchten, sollten Sie Weiß erhalten. –

+0

@Andrei: In der Tat. http://en.wikipedia.org/wiki/HSL_and_HSV: "HSV steht für Farbton, Sättigung und Wert und wird oft auch HSB (B für Helligkeit) genannt." – JAB

1

Vielleicht this wird helfen. Das JDK scheint nicht sehr hilfreich zu sein, wenn Farben in einem anderen Farbraum verwendet werden sollen.

Edit: In ColorSpace.getName(idx) gibt es dieses kleine Schnipsel:

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

so war es, was Sie gedacht, aber Blick auf die Art Hierarchie von Color es scheint nicht überall in irgendeiner Weise verwendet oder implementiert werden. ColorSpace wird nur um zwei weitere Klassen erweitert: BogusColorSpace und ICC_ColorSpace. Ich vermute, dass Entwickler erwarten, dass sie ihre eigenen Implementierungen für verschiedene Farbräume erstellen.

9

EDIT: Ich weiß, HSB = HSL, unten ist die Antwort für HSB.

Ich glaube nicht, dass hier ColorSpaces benötigt wird. Versuchen Sie etwas wie das folgende:

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

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

Beachten Sie, dass das B ist eigentlich" Helligkeit ", nicht Helligkeit/Helligkeit, und ist ein anderer Begriff für die" Wert "Attribut von der HSV-Farbraum – JAB

+1

Ich musste dies ein Downvote geben, da HSB! = HLS – Supuhstar

9

Die meisten der gegebenen Antworten scheinen hier anzunehmen, dass HSL == HSB, was falsch ist. Der HSB-Farbraum ist in vielen Fällen nützlich (und verwendet), aber es gibt eine bemerkenswerte Ausnahme: CSS. Die Nicht-RGB-CSS-Farbfunktionen hsl() und hsla() sind HSL, nicht HSB. Daher ist es sehr nützlich, in und aus HSL in Java konvertieren zu können.

Es gibt eine gute writeup über das Problem hier: http://tips4java.wordpress.com/2009/07/05/hsl-color/ TL; DR: Der Code ist hier: http://www.camick.com/java/source/HSLColor.java

Die Methoden darin sind ziemlich leicht zu extrahieren, wenn Sie die ganze Klasse nicht benutzen wollen.

Es scheint nicht, dass der Autor der Klasse eine Lizenz enthalten, obwohl der Kontext des Blogposts Public Domain zu sein scheint. Benutze dein eigenes Urteil.

4

Hier ist eine einfache Implementierung, die eine Farbe auf Basis von Farbton, Sättigung und Helligkeitswerten von 0,0 bis 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

Dies ist die Antwort ist nutzlos ohne 'hue2rgb'. – Supuhstar

Verwandte Themen