我想使用各种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 at java.awt.Color中。(Color.java:525)
查看Color的文档,我看到了这条有用的消息:
抛出:IllegalArgumentException - 如果有任何值 组件数组或alpha超出范围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]);
}
}