Как я могу использовать цветовое пространство HSL в Java?

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

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

+14
источник поделиться
6 ответов

EDIT: Я понимаю 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);
+9
источник

Большинство приведенных ответов здесь, похоже, предполагают, что 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
источник

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

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

Изменить: В ColorSpace.getName(idx) есть этот небольшой фрагмент:

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

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

+1
источник

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

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос