Как я могу использовать цветовое пространство HSL в Java?
Я посмотрел на класс ColorSpace и нашел константу TYPE_HLS
(где предположительно просто HSL в другом порядке).
могу ли я использовать эту константу для создания Color
от оттенка, насыщенности и яркости?
Если нет, есть ли какие-либо классы Java для этого, или мне нужно написать свой собственный?
6 ответов
большинство приведенных здесь ответов, похоже, предполагают, что HSL == HSB, что является ложным. Цветовое пространство HSB полезно (и используется) во многих случаях, но есть одно заметное исключение: CSS. Цветовые функции css без RGB, hsl() и hsla () - это HSL, а не HSB. Таким образом, очень полезно иметь возможность конвертировать в и из HSL в java.
здесь есть хорошая запись о проблеме:http://tips4java.wordpress.com/2009/07/05/hsl-color/ TL; DR: код здесь: http://www.camick.com/java/source/HSLColor.java
методы в нем довольно легко извлечь, если вы не хотите использовать весь класс.
не похоже, что автор класса включил лицензию, хотя контекст сообщения в блоге, похоже, подразумевает общественное достояние. Используйте свое собственное суждение.
EDIT: я понимаю 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));
}
может быть этой поможет. JDK не кажется очень полезным, когда вы хотите использовать цвета в другом цветовом пространстве.
Edit: In 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