如何比较rgb值,忽略alpha



正如问题所说,我想使用rgb值来比较两种颜色,但我想忽略alpha。我没有那些移位和逐位运算符,所以你能告诉我有比下面的代码更优雅的方法吗?

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

如果你想要一个有点明智的解决方案,它可以是这样的:

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()

是exclusive或(或xor)。其结果对于匹配的比特为0,对于不同的比特为1。如果整个整数匹配,则每个位的结果将仅为零。由于我们不关心阿尔法比特,步骤

(...) & 0x00_ff_ff_ff

是一个"and",因此只有当两边都有1时,结果才会有一个1。由于0x00_ff_ff_ff对于阿尔法通道位没有1,对于所有RGB位都没有1,因此这将仅保留对于RGB部分开启的位。

最后,对于一个匹配,我们现在期望所有位都关闭,因此我们可以将其与0进行比较。

最新更新