我有一个应用程序,要求我减少混合两种颜色(如混合它们得到一个结果,好像我混合了两种颜料) . 仅添加RGB不起作用,因为RGB值可以相加运行,而颜料则可以减少运算 .

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

所以我正在做的是沿着车轮上的最短距离平均色调值(因为我以相等的比例混合“颜料”) . 为了解释,混合蓝色(0.666)和红色(0或1)将评估为0.833,而不是0.666 . 在我的实现中,我考虑到这个或至少尝试,但有一些错误......

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;
}

当我混合蓝色和黄色时,我得到绿色色调 . 当我混合红色和黄色时,我得到一个橙色,但当我混合橙色和蓝色时,我得到一个粉红色 . 我想我正在做的事情有问题 .

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