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

我看过ColorSpace类,发现常量TYPE_HLS可能只是HSL的顺序不同)。

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

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

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

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

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

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

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

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

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

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

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

找到了:

  Color.getHSBColor(float h,float s,float b)