使用非标准ColorSpace创建颜色

时间:2012-03-16 02:04:06

标签: java colors color-space

我想使用各种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]);
    }

}

0 个答案:

没有答案