如何在Java中使用HSL颜色空间?

时间:2010-06-08 13:24:08

标签: java color-space hsl

我看了一下ColorSpace类,发现常量TYPE_HLS大概只是HSL的顺序不同)。

我可以使用此常量从色调,饱和度和亮度创建Color吗? 如果没有,是否有任何Java类,或者我需要编写自己的类吗?

6 个答案:

答案 0 :(得分:10)

这里给出的大多数答案似乎都假设HSL == HSB,这是假的。在许多情况下,HSB颜色空间很有用(并且使用),但有一个值得注意的例外:CSS。非RGB css颜色函数hsl()和hsla()是HSL,而不是HSB。因此,能够在java中转换为HSL非常有用。

这里有一个关于这个问题的好文章:http://tips4java.wordpress.com/2009/07/05/hsl-color/ TL; DR:代码在这里:http://www.camick.com/java/source/HSLColor.java

如果您不想使用整个班级,其中的方法很容易提取。

虽然博客文章的上下文似乎暗示了公共领域,但该类作者似乎并未包含许可证。用你自己的判断。

答案 1 :(得分:9)

编辑:我意识到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);

答案 2 :(得分:4)

这是一个简单的实现,它将根据色调,饱和度和亮度值从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;
}

答案 3 :(得分:1)

也许this会有所帮助。当想要在另一个颜色空间中使用颜色时,JDK似乎没有什么帮助。

编辑:在ColorSpace.getName(idx)中有这个小片段:

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

所以这就是你的想法,但是看看ColorSpace的类型层次结构,它似乎没有在任何地方以任何方式使用或实现。 ColorSpace只扩展了其他两个类BogusColorSpace和ICC_ColorSpace,所以我猜他们期望开发人员为不同的颜色空间创建自己的实现。

答案 4 :(得分:0)

如果您的输入是swing / awt小部件,那么使用 Java 7 JColorChooser ,您可以通过HSV和HSL空格获得Color。 http://java.dzone.com/articles/new-color-chooser-jdk-7

答案 5 :(得分:-1)