Вопрос

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

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

Это было полезно?

Решение 6

Другие советы

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

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

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

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: В ColorSpace.getName(idx) Есть этот маленький фрагмент:

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

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

Если ваш вход - виджеты Swing/AWT, то с Java 7 Jcolorchooser Вы можете получить цвет по пространствам HSV и HSL. http://java.dzone.com/articles/new-color-chooser-jdk-7

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top