我想做两件事:
- 比较两种颜色(RGB),如果颜色相同,比较器给我说 1,如果比较的颜色在 RGB 的相反两侧,如黑色和白色,则给我说 0,如果它们以某种方式相等,则为从 0 到 1 的某个数字(就像两者都是带红色的)
- 将两种或多种颜色混合在一起产生一种新的颜色:混合蓝色和黄色应该得到绿色,混合红色和绿色应该得到黑色等。
问题: java API 的任何部分可以为我做这样的事情吗?如果没有,是否有任何第三部分开源 java 库可以促进这一点?
谢谢。
我想做两件事:
问题: java API 的任何部分可以为我做这样的事情吗?如果没有,是否有任何第三部分开源 java 库可以促进这一点?
谢谢。
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 颜色空间之间的转换可能会有所帮助。