【问题标题】:How to invert an RGB color in integer form?如何以整数形式反转 RGB 颜色?
【发布时间】:2013-08-09 07:28:11
【问题描述】:

给定一个 32 位无符号整数形式的 RGB 颜色(例如 0xFF00FF),如何在不使用位移运算提取其各个分量的情况下反转它(获得负颜色)?

我想知道是否可以只使用按位运算(AND、OR、XOR)。

更准确地说,使用最少指令数的算法是什么?

【问题讨论】:

  • 0xFF00FF 只有 3 个字节或 24 位,而不是 32 位。
  • 我只对颜色感兴趣,所以剩下的字节无关紧要,因此被省略了。感谢您的投票。

标签: graphics colors


【解决方案1】:

我认为这很简单。 你可以只计算 0xFFFFFF-YourColor。它将是反转的颜色。

int neg = 0xFFFFFF - originalRGB

// optional: set alpha to 255:
int neg = (0xFFFFFF - originalRGB) | 0xFF000000;

【讨论】:

  • 虽然这也会反转 Alpha...可能不是 OP 想要的...尝试 0x00FFFFFF - YourColor 代替
  • @CPUTerminator:这也不会让 alpha 保持不变。像(0x00FFFFFFU - (input | 0xFF000000U)) | (input & 0xFF000000U) 这样的东西就足够了。
  • @caf 我的错误...匆匆浏览了我的评论...不过可以做到 (0xFFFFFFFF - Color) + (0xFF000000 & Color)。
  • @CPUTerminator:不,那会使 alpha 为 0xFF。
  • 为了更好地回答这个问题,您能否准确解释一下这段代码是如何得出结果的?
【解决方案2】:

使用此方法反转每种颜色并保持原始 alpha。

int invert(int color) {
  return color ^ 0x00ffffff;
}

xor (^) 与 0 返回未修改的原始值。 xor 与0xff 翻转位。所以在上面的例子中,我们有0xaarrggbb,我们正在翻转/反转 r、g 和 b。

这应该是反转颜色的最有效方法。算术比这种完全简单的按位操作(稍微)慢。

如果你想忽略原始 alpha,只是让它不透明,你可以覆盖 alpha:

int invert(int color) {
  0xff000000 | ~color;
}

在这种情况下,我们只需翻转每一位颜色以反转包括 alpha 在内的所有通道,然后通过使用0xff000000 强制前 8 位高将 alpha 通道覆盖为不透明。

【讨论】:

    【解决方案3】:

    您可以简单地执行颜色的否定。片段:

    ~ color
    

    【讨论】:

    • 似乎是最简单的解决方案,但我想它会有 alpha 反转问题
    【解决方案4】:
    Color color_original = Color.lightGray;
    
    int rgb = color_original.getRGB();
    
    int inverted = (0x00FFFFFF - (rgb | 0xFF000000)) | (rgb & 0xFF000000);
    
    Color color_inverted = new Color(inverted);
    

    【讨论】:

      【解决方案5】:

      您的问题不清楚; RGB 中没有颜色是“负色”。

      您可以反转图像,就好像它是底片一样。你是这个意思吗?

      如果您想反转只有一个颜色像素0xFF00FF 的图像,计算方法是从白色中减去0xFFFFFF

      > negative_result_color = 0xFFFFFF - 0xFF00FF
      > negative_result_color == 0x00FF00
      true
      

      在计算机中,减法是通过添加恭维来完成的: http://en.wikipedia.org/wiki/Method_of_complements#Binary_example

      但是说真的,你为什么不让机器用你的普通代码为你做减法呢?这是他们擅长的。

      【讨论】:

        猜你喜欢
        • 2013-06-15
        • 2021-12-14
        • 2012-07-13
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        相关资源
        最近更新 更多