Создание цвета с нестандартным ColorSpace - PullRequest
0 голосов
/ 16 марта 2012

Я хочу создавать цвета, используя различные 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]);
    }

}
...