Как я могу использовать цветовое пространство HSL в Java? - PullRequest
17 голосов
/ 08 июня 2010

Я посмотрел на класс ColorSpace и нашел константу TYPE_HLS (которая предположительно - это просто HSL в другом порядке).

Могу ли я использовать эту константусоздать Color из оттенка, насыщенности и яркости?Если нет, существуют ли для этого какие-либо классы Java или мне нужно написать свой собственный?

Ответы [ 6 ]

11 голосов
/ 30 декабря 2013

Большинство приведенных здесь ответов, похоже, предполагают, что HSL == HSB, что неверно. Цветовое пространство HSB полезно (и используется) во многих случаях, но есть одно заметное исключение: CSS. Цветовые функции не-RGB CSS, hsl () и hsla () - это HSL, а не HSB. Таким образом, очень полезно иметь возможность конвертировать в и из HSL в Java.

Здесь есть хорошая запись о проблеме: http://tips4java.wordpress.com/2009/07/05/hsl-color/ TL; DR: код здесь: http://www.camick.com/java/source/HSLColor.java

Методы в них довольно легко извлечь, если вы не хотите использовать весь класс.

Не похоже, что автор класса включил лицензию, хотя контекст поста в блоге, похоже, подразумевает общественное достояние. Используйте свое собственное суждение.

9 голосов
/ 08 июня 2010

РЕДАКТИРОВАТЬ: я понимаю, HSB! = HSL, ответ ниже для HSB.

Я не думаю, что здесь есть необходимость использовать ColorSpaces.Попробуйте что-то вроде следующего:

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

Color myRGBColor = Color.getHSBColor(hue, saturation, brightness);
4 голосов
/ 27 ноября 2015

Вот простая реализация, которая возвращает Color на основе значений оттенка, насыщенности и яркости от 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));
}

РЕДАКТИРОВАТЬ Yona-Appletree:

Я нашел правильную функцию hue2rgb и протестировал ее как работающую:

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;
}
1 голос
/ 08 июня 2010

Может быть это поможет. JDK не очень помогает при желании использовать цвета в другом цветовом пространстве.

Редактировать: В ColorSpace.getName(idx) есть этот маленький фрагмент:

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

так что вы и думали, но, глядя на иерархию типов ColorSpace, кажется, что она нигде не используется и не реализуется. ColorSpace расширяется только двумя другими классами BogusColorSpace и ICC_ColorSpace, поэтому я предполагаю, что они ожидают от разработчиков создания собственных реализаций для разных цветовых пространств.

0 голосов
/ 30 января 2013

Если вы используете виджеты Swing / AWT, то с помощью Java 7 JColorChooser вы можете получить цвет по HSV и HSL. http://java.dzone.com/articles/new-color-chooser-jdk-7

0 голосов
/ 08 июня 2010

Нашли:

<a href="http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html#getHSBColor(float,%20float,%20float)" rel="nofollow noreferrer">Color.getHSBColor(float h, float s, float b)</a>
...