Java:RGB,HSL和减色混合

时间:2016-04-24 21:01:12

标签: java algorithm colors rgb light

我有一个应用程序,要求我减少混合两种颜色(如混合它们得到结果,好像我混合了两种颜料)。只是添加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值,产生与颜料混合相匹配的结果?或者我是在(半)正确的轨道上犯了错误?

0 个答案:

没有答案