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

时间:2013-08-09 07:28:12

标签: graphics colors

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

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

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

5 个答案:

答案 0 :(得分:17)

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

int neg = 0xFFFFFF - originalRGB

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

答案 1 :(得分:8)

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

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

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

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

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

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

答案 2 :(得分:3)

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

~ color

答案 3 :(得分:0)

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

你可以反转一个图像,好像它是一个负片。那是你的意思吗?

如果您想要反转只有一个颜色0xFF00FF像素的图像,则计算将从白色0xFFFFFF中减去。

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

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

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

答案 4 :(得分:0)

Color color_original = Color.lightGray;

int rgb = color_original.getRGB();

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

Color color_inverted = new Color(inverted);