Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:RGB、HSL和减色混色_Java_Algorithm_Colors_Rgb_Light - Fatal编程技术网

Java:RGB、HSL和减色混色

Java:RGB、HSL和减色混色,java,algorithm,colors,rgb,light,Java,Algorithm,Colors,Rgb,Light,我有一个应用程序,它要求我用减法混合两种颜色(就像混合两种颜料一样)。仅仅添加RGB不起作用,因为RGB值是以相加方式操作的,而颜料是以减法操作的 所以我要做的是使用HSL值。我使用Java的一种颜色方法将RGB转换为HSL。我看到的颜色就像轮子上的度数。红色的色调值为0,绿色为0.333,蓝色为0.666。由于这是一个车轮,红色也可以是1,绿色也可以是1.333 所以我要做的是沿着轮子上最短的距离平均色调值(当我以相等的比例混合“颜料”时)。为了解释这一点,将蓝色(0.666)和红色(0或1)

我有一个应用程序,它要求我用减法混合两种颜色(就像混合两种颜料一样)。仅仅添加RGB不起作用,因为RGB值是以相加方式操作的,而颜料是以减法操作的

所以我要做的是使用HSL值。我使用Java的一种颜色方法将RGB转换为HSL。我看到的颜色就像轮子上的度数。红色的色调值为0,绿色为0.333,蓝色为0.666。由于这是一个车轮,红色也可以是1,绿色也可以是1.333

所以我要做的是沿着轮子上最短的距离平均色调值(当我以相等的比例混合“颜料”时)。为了解释这一点,将蓝色(0.666)和红色(0或1)混合在一起将计算为0.833,而不是0.666。在我的实现中,我解释了这一点,或者至少尝试了解释,但是有一些bug

public static Color addColors(Color a, Color b) {

    float[] aHSB = toHSB(a);
    float[] bHSB = toHSB(b);

    double aHue = aHSB[0];
    double bHue = bHSB[0];

    System.out.println(aHue * 360 + ", " + bHue * 360);

    double c = 0;

    if (Math.abs(Math.abs(aHue - bHue) - 0.5) < 0.01) {
        return Color.BLACK; //to account for complimentary colors
    }

    if (Math.abs(aHue - bHue) > 0.51) {
        c = 0.5;
    }

    float temp = (float) (((aHue + bHue) / 2) % 1 + c);

    Color d = new Color(Color.HSBtoRGB(temp, 
                            (aHSB[1] + bHSB[1]) / 2, 
                            (aHSB[2] + bHSB[2]) / 2));


    return d;
}
公共静态颜色addColors(颜色a、颜色b){
浮动[]aHSB=toHSB(a);
浮动[]bHSB=toHSB(b);
双aHue=aHSB[0];
双bHue=bHSB[0];
系统输出打印LN(aHue*360+,“+bHue*360);
双c=0;
如果(数学abs(数学abs(aHue-bHue)-0.5)<0.01){
return Color.BLACK;//用于说明赠品颜色
}
如果(数学绝对值(aHue-bHue)>0.51){
c=0.5;
}
浮动温度=(浮动)((aHue+bHue)/2)%1+c);
颜色d=新颜色(颜色HSBtoRGB(温度、,
(aHSB[1]+bHSB[1])/2,
(aHSB[2]+bHSB[2])/2);
返回d;
}
当我把蓝色和黄色混合在一起时,我会得到一种略带绿色的色调。当我混合红色和黄色时,我得到一个橙色,但当我混合橙色和蓝色时,我得到一个粉色。我想我正在做的事情会有问题


有没有更好的方法来混合给定RGB值的颜色,从而产生与颜料混合匹配的结果?或者我是在(半)正确的轨道上,刚刚犯了一个错误?

我不确定
是否返回新颜色(a.getRGB()&b.getRGB())在这里是一个足够的答案…(顺便说一句,注意,混合蓝色和黄色应该会产生黑色。请参阅)我不确定
是否返回新颜色(a.getRGB()&b.getRGB())在这里是一个足够的答案…(顺便说一句,请注意,蓝色和黄色混合会产生黑色。请参阅)