2

我想根据两个现有的叠加或更多计算新颜色。

我的颜色是这样存储的:

int color1 = 0xffFF00FF;
int color2 = 0x00FFFFFF;

现在你可以知道这是以十六进制格式分配的。我知道这些将在运行时(或编译期间)转换为“真实”数字。

0x如您所知,这些十六进制“字符串”是在表示此颜色的 alpha之后使用前两个符号构建的(例如ff00在这种情况下)。

我现在想覆盖它们,以便获得新的颜色 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 上)对于我的特殊情况来说是不够的。我发现的大部分内容都是关于 hex-string 到 int 对话和相反的;)

提前致谢,

基督教

4

1 回答 1

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)应该没问题。我不太确定阿尔法...

于 2013-10-14T13:50:14.830 回答