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