【问题标题】:Combine/compare colors in java在java中组合/比较颜色
【发布时间】:2012-09-05 23:59:57
【问题描述】:

我想做两件事:

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

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

谢谢。

【问题讨论】:

标签: java


【解决方案1】:

1.

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

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 值

int rgb = (r

编辑:请注意计算机使用“红色绿色蓝色”,其中黄色是绿色和蓝色的组合,而不是相反。可以转换,但是我还没做。也许conversion between rgb and ryb color spaces 可能会有所帮助。

【讨论】:

  • 谢谢你的回答,如果我有公式的话。我会先尝试分别取每种颜色的平均值,然后看看会发生什么。
  • 另外:使用 `java.awt.Color´ 可能会使您的代码更易于阅读... int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue();新颜色(r,g,b);
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 2013-02-22
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2011-10-04
  • 2012-03-14
相关资源
最近更新 更多