如何在Java中使用HSL Colorspace?
-
24-10-2019 - |
题
我看过Colorspace课程,发现了常数 TYPE_HLS
(哪个 想必 仅按不同的顺序进行HSL)。
我可以使用这个常数创建一个 Color
来自色相,饱和度和光度?如果没有,是否有任何Java课程,或者我需要写自己的课程?
解决方案 6
其他提示
这里的大多数给定答案似乎假设HSL == HSB,这是错误的。 HSB Colorspace在许多情况下很有用(并使用),但是有一个值得注意的例外: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));
}
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似乎并没有很有帮助。
编辑:in ColorSpace.getName(idx)
有这个小片段:
case ColorSpace.TYPE_HLS:
compName = new String[] {"Hue", "Lightness",
"Saturation"};
因此,这就是您的想法,但是查看Colorspace的类型层次结构,它似乎并未以任何方式使用或实现。 Colorspace仅由其他两个类Boguscolorspace和ICC_Colorspace扩展,因此我想他们希望开发人员为不同的颜色空间创建自己的实现。
如果您的输入是摇摆/awt小部件,那么 Java 7 Jcolorchooser 您可以通过HSV和HSL空间获得颜色。 http://java.dzone.com/articles/new-color-chooser-jdk-7