【问题标题】:How to compare rgb values, ignoring alpha如何比较 rgb 值,忽略 alpha
【发布时间】:2018-03-29 13:10:47
【问题描述】:

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

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

【问题讨论】:

  • 似乎您可能想查看使用getColorComponents 方法(docs.oracle.com/javase/7/docs/api/java/awt/…)但传入一个空数组或不同的数组。它可能通过数组比较稍微干净一些,但速度可能可以忽略不计。
  • 所以我可以像c1.getColorComponents(null).equals(c2.getColorComponents(null))那样做?
  • getRGB,所以你可以一次比较R G和B

标签: java colors bit-manipulation rgb


【解决方案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()

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

(...) & 0x00_ff_ff_ff

是一个“和”,所以只有在两边都有一个 1 时,结果才会有一个 1 位。由于 0x00_ff_ff_ff 的 alpha 通道位没有 1,所有 RGB 位都没有 1,所以这只会保留 RGB 部分的位。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2022-08-24
    • 2018-07-05
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多