2012-09-12 62 views
1

颜色我希望做两件事情:合并/比较Java中

  1. 比较两种颜色(RGB),这样比较器给我说一声,如果颜色是相同的,并且0,如果比较的颜色在RGB的相反两侧像黑色和白色,以及某些数字从0到1(如果它们在某种程度上相等)(如两者都是红色的)
  2. 将2种或更多种颜色混合在一起产生一个新的:混合蓝色和黄色应该给我绿色,混合红色和绿色应该给黑等

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

谢谢。

+1

你看过:http://stackoverflow.com/questions/9018016/how-to-compare-two-colors? – condit

+0

谢谢,我已经看到了,它看起来很复杂,我现在没有时间去理解它。 – BanditoBunny

+0

颜色距离度量标准通常很复杂。你可以通过像* 1 - A/B *这样的方式作弊(如果准确性不是很大)。 – oldrinb

回答

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值放回使用

INT RGB =(R < < 16)的单个RGB值| (g < < 8)| b

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

+0

感谢您的回答,如果我有公式。我会先尝试分别拿出每种颜色的平均值,看看会发生什么。 – BanditoBunny

+0

另外:使用'java.awt.Color'可能会让你的代码更容易阅读... int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue();新颜色(r,g,b); – neXus