14

给定一个 32 位无符号整数形式的 RGB 颜色(例如 0xFF00FF),您将如何反转它(获得负颜色),而不使用位移操作提取其各个分量?

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

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

4

5 回答 5

23

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

int neg = 0xFFFFFF - originalRGB

// optional: set alpha to 255:
int neg = (0xFFFFFF - originalRGB) | 0xFF000000;
于 2013-08-09T07:33:25.260 回答
14

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

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

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

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

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

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

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

于 2017-04-11T02:12:02.543 回答
4

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

~ color
于 2013-08-09T07:38:21.337 回答
0
Color color_original = Color.lightGray;

int rgb = color_original.getRGB();

int inverted = (0x00FFFFFF - (rgb | 0xFF000000)) | (rgb & 0xFF000000);

Color color_inverted = new Color(inverted);
于 2014-08-21T11:23:55.433 回答
0

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

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

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

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

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

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

于 2013-08-09T07:45:33.183 回答