我希望根据现有的两种颜色叠加或更多地计算新颜色。
我的颜色存储方式如下:
int color1 = 0xffFF00FF;
int color2 = 0x00FFFFFF;
现在您可以告诉它以十六进制格式分配。我知道这些将在运行时(或编译期间)转换为“真实”数字。
如您所知,这些十六进制“字符串”是使用0x
重新表示此颜色的alpha后的前两个符号构建的(例如ff
和00
。< / p>
我现在想要覆盖它们,这样我就可以获得新的颜色int值。我希望能够选择叠加算法(屏幕,乘法,加法,减法,除法等)。
我在互联网上做了很多研究,但没有任何事情告诉我如何解决我的问题。
我已经尝试了大量的东西,并进行了密集的测试和调试,但我现在处于一个我现在不再做什么的地步。
例如:
我尝试做一些简单的数学运算来得到add方法等,如下所示:
return a + b;
return a - b;
return a * b;
return a / b;
// Even stuff like color burn
return (1 - (1 - a) / b);
我从Wikipedia得到了这些,但我想,根据输出,这是基于RGBA格式(255/255/255/100)
而不是十六进制的东西。
然后我尝试使用java.awt.Color
类和二进制操作(a && 0xff)
将十六进制内容转换为RGBA值等等。
我几天都在研究这个问题并且我不确切知道我是如何详细完成所有这些事情的,但我知道它们都没有按预期工作(例如,没有考虑Alpha值。
也许我只是有一个完全错误的起点,或者只是看着并朝着错误的方向努力。迄今为止的所有事情(也在SO上)都不足以满足我的特殊情况。我发现的大多数东西都是在谈论十六进制到对话和对话;)
提前致谢,
基督教
答案 0 :(得分:4)
我猜您需要这些值的加权平均值。这样的事情:
int color1 = 0xffFF00FF;
int color2 = 0x00FFFFFF;
Color c1 = new Color(color1, true);
Color c2 = new Color(color2, true);
int a1 = c1.getAlpha();
int a2 = c2.getAlpha();
Color result = new Color((c1.getRed() * a1 + c2.getRed() * a2) / (a1 + a2),
(c1.getGreen() * a1 + c2.getGreen() * a2) / (a1 + a2),
(c1.getBlue() * a1 + c2.getBlue() * a2) / (a1 + a2),
(c1.getAlpha() + c2.getAlpha()) / 2);
System.out.println(c1);
System.out.println(c2);
System.out.println(result);
至少对于3种颜色(rgb)应该没问题。我不太确定阿尔法......