1

我想做两件事:

  1. 比较两种颜色(RGB),如果颜色相同,比较器给我说 1,如果比较的颜色在 RGB 的相反两侧,如黑色和白色,则给我说 0,如果它们以某种方式相等,则为从 0 到 1 的某个数字(就像两者都是带红色的)
  2. 将两种或多种颜色混合在一起产生一种新的颜色:混合蓝色和黄色应该得到绿色,混合红色和绿色应该得到黑色等。

问题: java API 的任何部分可以为我做这样的事情吗?如果没有,是否有任何第三部分开源 java 库可以促进这一点?

谢谢。

4

1 回答 1

1

1.

比较颜色有很多不同的方法。如果您想要感知差异,请查看其他用户的评论。如果您只想要一些简单的指示:使用以下代码:

int rgb1 = ...
int rgb2 = ...
int r, g, b;

r = (rgb1 >> 16) & 0x000000ff;
g = (rgb1 >> 8) & 0x000000ff;
b = rgb1 & 0x000000ff;

r -= (rgb2 >> 16) & 0x000000ff;
g -= (rgb2 >> 8) & 0x000000ff;
b -= rgb2 & 0x000000ff;

double answer = (r*r+g*g+b*b)/(255*255*3.0);

它计算欧几里得距离并将其缩放到从 0 到 1 的范围。

2.

正如有许多不同的方法来比较颜色一样,也有许多方法可以组合颜色。这取决于你想要什么。你可以取平均值,但这不是你想要的。因为它会使生成的颜色变暗。

编辑:这是取平均值的代码:

r = (rgb1 >> 16) & 0x000000ff;
g = (rgb1 >> 8) & 0x000000ff;
b = rgb1 & 0x000000ff;

r += (rgb2 >> 16) & 0x000000ff;
g += (rgb2 >> 8) & 0x000000ff;
b += rgb2 & 0x000000ff;

int average = ((r/2)<<16)+((g/2)<<8)+(b/2);

如果您有点数学倾向,请考虑一下您实际寻找的行为,并尝试将其放入一个公式(或者更确切地说是 3 个公式,一个用于红色,一个用于绿色,一个用于蓝色)它应该不难转换java代码的公式。

您可以使用将单个 r、g 和 b 值放回单个 rgb 值

整数 RGB = (r<<16) | (g<<8) | b

编辑:请注意计算机使用“red GREEN blue”,其中黄色是绿色和蓝色的组合,而不是相反。可以转换,但是我还没做。也许rgb 和 ryb 颜色空间之间的转换可能会有所帮助。

于 2012-09-13T15:36:05.723 回答