2017-10-17 344 views
0

正如问题所述,我想比较两种颜色使用它们的rgb值,但我想忽略alpha。 我没有得到那些位移和位智的操作符,所以你能告诉我有没有比下面的代码更优雅的方式来做到这一点?如何比较rgb值,忽略alpha

boolean compareRGB(Color c1, Color c2) { 
    return c1.getRed() == c2.getRed() && c1.getGreen() == c2.getGreen() && c1.getBlue() == c2.getBlue(); 
} 
+1

好像你可能想看看在使用'getColorComponents'方法(https://开头的文档。 oracle.com/javase/7/docs/api/java/awt/Color.html#getColorComponents(float [])),但传入一个空数组或另一个数组。它可能通过数组比较反而变得更简洁,但可能慢得可以忽略不计。 – Raizuri

+0

所以我可以像'c1.getColorComponents(null).equals(c2.getColorComponents(null))'那样做? – Duke

+0

有'getRGB',所以你可以一次比较R G和B – harold

回答

1

如果你想逐位解决方案,它看起来是这样的:

public static boolean equalsIgnoreAlpha(Color c1, Color c2) { 
    return ((c1.getRGB()^c2.getRGB()) & 0x00_ff_ff_ff) == 0x00_00_00_00; 
} 

第一部分

c1.getRGB()^c2.getRGB() 

是异或(XOR或)。其结果将匹配的位为0,而对于不同的位则为1。如果整个匹配结果的整数只是每个位都为零。由于我们不关心alpha位,步骤

(...) & 0x00_ff_ff_ff 

是“和”,因此结果具有在一个有点1只有在有两侧1。由于0x00_ff_ff_ff对于alpha通道位没有1,对于所有的RGB位都没有1,所以这只会保留RGB部分开启的位。

最后,对于比赛,我们现在希望所有的位都关闭,所以我们可以比较为0