Come posso utilizzare il metodo colore HSL in Java?
-
24-10-2019 - |
Domanda
Ho avuto uno sguardo alla classe di ColorSpace, e ha trovato la costante TYPE_HLS
(che presumibilmente è solo HSL in un ordine diverso).
È possibile utilizzare questa costante per creare un Color
da tonalità, saturazione e luminosità?
In caso contrario, ci sono classi Java per questo, o devo scrivere il mio?
Soluzione 6
Altri suggerimenti
La maggior parte delle risposte date qui sembrano supporre che HSL == HSB, che è falso. Lo spazio colore HSB è utile (e utilizzato), in molti casi, ma c'è una notevole eccezione: CSS. Le funzioni di colore css non RGB, HSL () e HSLA () sono HSL, non HSB. Come tale, essa è molto utile per essere in grado di convertire da e verso HSL in Java.
C'è una buona interessante resoconto in merito al problema qui: http://tips4java.wordpress.com/ 2009/07/05 / HSL-colore / TL; DR: il codice è qui: http: / /www.camick.com/java/source/HSLColor.java
I metodi in esso sono abbastanza facili da estrarre se non si desidera utilizzare l'intera classe.
E non sembra che l'autore della classe comprendeva una licenza, se il contesto del post sembra implicare dominio pubblico. Utilizzare il proprio giudizio.
EDIT: mi rendo conto HSB = HSL, la risposta sotto è per HSB
!.Non credo che ci sia alcuna necessità di utilizzare spazi di colori qui. Provare qualcosa di simile al seguente:
float hue = 0.9f; //hue
float saturation = 1.0f; //saturation
float brightness = 0.8f; //brightness
Color myRGBColor = Color.getHSBColor(hue, saturation, brightness);
Ecco un'implementazione semplice che restituirà un colore in base a tonalità, saturazione e luminanza da 0.0 a 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 da Yona-Appletree:
Ho trovato quello che penso è la funzione hue2rgb corretta e provato come lavorare:
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;
}
questo aiuterà. Il JDK non sembra essere molto utile quando si vuole usare i colori in un altro spazio di colore.
Edit: In ColorSpace.getName(idx)
c'è questo piccolo frammento:
case ColorSpace.TYPE_HLS:
compName = new String[] {"Hue", "Lightness",
"Saturation"};
quindi è stato quello che si pensava, ma guardando il tipo di gerarchia ColorSpace non sembra per essere utilizzato o implementate in alcun modo nessuna parte. ColorSpace è prorogato di due sole altre classi BogusColorSpace e ICC_ColorSpace, quindi sto cercando di indovinare si aspettano gli sviluppatori di creare le proprie implementazioni per i diversi spazi colore.
Se il vostro ingresso è oscillazione / widgets AWT, poi con Java 7 JColorChooser è possibile ottenere colori da HSV e HSL spazi. http://java.dzone.com/articles/new-color-chooser -jdk-7