Я хочу создавать цвета, используя различные ColorSpaces. Некоторые из этих значений хранятся за пределами стандартного диапазона [0,1] (HSV, Lab).
ColorSpace hsv = new HSVColorSpace(); //custom class
Color green = new Color(hsv, new float[] {60.f, 1.f, 1.f}, 1.f);
Однако вторая строка выдает исключение времени выполнения:
Исключение в потоке "main" java.lang.IllegalArgumentException: параметр цвета вне ожидаемого диапазона: компонент 0 в
java.awt.Color. (Color.java:525)
Глядя на документацию по цвету, я вижу это полезное сообщение:
Броски: IllegalArgumentException - если любое из значений в
массив компонентов или альфа находится вне диапазона от 0,0 до 1,0
Мне это кажется странным - разве это не должно быть, «если какие-либо значения в массиве компонентов находятся за пределами их допустимых диапазонов, как указано в colorspace.getMinValue (int) и colorspace.getMaxValue (int) '? Это ошибка или я неправильно понял намерение?
Обновление
Комментарии ниже предполагают, что виновата моя реализация HSVColorSpace. Математика от RGB до HSV довольно сложна и может легко содержать ошибку, поэтому вот ясный класс «заглушки», который дает то же исключение.
import java.awt.Color;
import java.awt.color.ColorSpace;
public class HSVColorSpace extends ColorSpace {
public HSVColorSpace() {
super(ColorSpace.TYPE_HSV, 3);
}
static final ColorSpace sRGB = ColorSpace.getInstance(CS_sRGB);
@Override
public float[] fromCIEXYZ(float[] xyz) {
float[] hsv = this.fromRGB(sRGB.fromCIEXYZ(xyz));
return hsv;
}
@Override
public float[] fromRGB(float[] rgb) {
return new float[] {0.f,1.f,1.f}; //STUB; convert everything to red
}
@Override
public float[] toCIEXYZ(float[] hsv) {
float[] xyz = sRGB.toCIEXYZ(this.toRGB(hsv));
return xyz;
}
@Override
public float[] toRGB(float[] hsv) {
return new float[] {1.f,0.f,0.f}; // STUB; convert everything to red
}
@Override
public float getMaxValue(int component) {
switch(component) {
case 0:
return 360.f;
case 1:
case 2:
return 1.f;
default:
throw new IllegalArgumentException("Component must be in [0,2]");
}
}
public static void main(String[] args) {
ColorSpace hsv = new HSV();
Color c = new Color(hsv,new float[] {60.f,1.f,1.f}, 1.f); // throws Exception
ColorSpace sRGB = ColorSpace.getInstance(CS_sRGB);
float[] hsvComps = c.getColorComponents(null);
float[] rgbComps = c.getComponents(sRGB, null);
System.out.format("HSV [%f,%f,%f] to RGB [%f,%f,%f]%n",hsvComps[0],hsvComps[1],hsvComps[2],
rgbComps[0],rgbComps[1],rgbComps[2]);
}
}