21

我查看了 ColorSpace 类,并找到了常量TYPE_HLS可能只是 HSL 的顺序不同)。

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

4

6 回答 6

12

编辑:我意识到 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);
于 2010-06-08T13:55:21.547 回答
12

这里给出的大多数答案似乎都假设 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

我已经创建了一个 gist 备份,如果博客关闭:https ://gist.github.com/Yona-Appletree/0c4b58763f070ae8cdff7db583c82563

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

执照

如博客的“关于”页面 ( https://tips4java.wordpress.com/about/ )中所述,该代码似乎位于公共域中:

We assume no responsibility for the code. You are free to use and/or modify and/or distribute any or all code posted on the Java Tips Weblog without restriction. A credit in the code comments would be nice, but not in any way mandatory.
于 2013-12-30T18:32:52.967 回答
8

这是一个简单的实现,它将根据从 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;
}
于 2015-11-26T21:55:54.147 回答
3

我找到了HSB的内置方法(与HSL不同,但相似)

[Color.getHSBColor(float h, float s, float b)](http://docs.oracle.com/javase/7/docs/api/java/awt/Color.html#getHSBColor(float,%20float,% 20浮动))
于 2010-06-08T13:50:18.220 回答
1

也许会有所帮助。当想要在另一个颜色空间中使用颜色时,JDK 似乎不是很有帮助。

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

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

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

于 2010-06-08T13:39:14.623 回答
0

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

于 2013-01-30T10:57:13.420 回答