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