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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top