Как инвертировать цвет RGB в целочисленной форме?

учитывая цвет RGB в 32-разрядной целочисленной форме без знака (например . 0xFF00FF), как бы вы инвертировали его (получили отрицательный цвет), не извлекая его отдельные компоненты с помощью операций bitshift?

интересно, можно ли использовать только побитовые операции (и, или, XOR).

точнее, какой алгоритм использует наименьшее количество инструкций?

5 ответов


Я думаю, что это так просто. Вы можете просто вычислить 0xFFFFFF-YourColor. Он будет показываться.

int neg = 0xFFFFFF - originalRGB

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

используйте этот метод, чтобы инвертировать каждый цвет и сохранить оригинал Альфа.

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

xor (^) С 0 возвращает исходное значение неизменным. xor с 0xff переворачивает биты. так, в приведенном выше случае мы имеем 0xaarrggbb мы переворачиваем / инвертируем r, g и b.

это должен быть самый эффективный способ инвертировать цвет. арифметика (незначительно) медленнее, чем эта совершенно простая бит-мудрая манипуляция.

если вы хотите игнорировать оригинальный альфа, и просто сделать это непрозрачно, вы можете перезаписать Альфа:

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

в этом случае мы просто переворачиваем каждый бит цвета на обратный каждый канал, включая Альфа, а затем перезаписываем альфа-канал на непрозрачный, заставляя первые 8 бит высоко с 0xff000000.


вы можете просто выполнить отрицание цвета. Фрагмент:

~ color

Color color_original = Color.lightGray;

int rgb = color_original.getRGB();

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

Color color_inverted = new Color(inverted);

ваш вопрос неясен; никакие цвета в RGB не являются "отрицательными цветами".

вы можете инвертировать изображение, как будто это был негатив. Вы это имели в виду?

Если вы хотите инвертировать изображение, которое имеет только один пиксель цвета 0xFF00FF, расчет заключается в вычитании из белого,0xFFFFFF.

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

в компьютере вычитание выполняется добавлять в комплимент: http://en.wikipedia.org/wiki/Method_of_complements#Binary_example

но серьезно, почему бы вам просто не позволить машине сделать вычитание за вас с вашим обычным кодом? Его что они хороший at.