如何以整数形式反转RGB颜色?

skr*_*rat 11 graphics colors

给定32位无符号整数形式的RGB颜色(例如0xFF00FF),如何在不使用bitshift操作提取其各个组件的情况下将其反转(获得负色)?

我想知道是否可以使用按位运算(AND,OR,XOR).

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

Ahm*_*mad 18

我认为这很简单.你可以计算0xFFFFFF-YourColor.它将是倒置的颜色.

int neg = 0xFFFFFF - originalRGB

// optional: set alpha to 255:
int neg = (0xFFFFFF - originalRGB) | 0xFF000000;
Run Code Online (Sandbox Code Playgroud)

  • @CPUTerminator:这也不会保持alpha不变.类似`(0x00FFFFFFU - (输入| 0xFF000000U))| (输入&0xFF000000U)`应该足够了. (3认同)
  • 虽然这也会反转Alpha ......可能不是OP想要的......试试0x00FFFFFF - YourColor (2认同)

And*_*sch 9

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

int invert(int color) {
  return color ^ 0x00ffffff;
}
Run Code Online (Sandbox Code Playgroud)

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

这应该是最有效的反转颜色的方法.算术(略微)慢于这种完全简单的逐位操作.

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

int invert(int color) {
  0xff000000 | ~color;
}
Run Code Online (Sandbox Code Playgroud)

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