14

32 ビットの符号なし整数形式 (例: 0xFF00FF) の RGB カラーが与えられた場合、ビットシフト操作を使用して個々のコンポーネントを抽出せずに、どのように反転 (負の色を取得) しますか?

ビット単位の演算 (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 に答える
4

色の否定を実行するだけです。スニペット:

~ color
于 2013-08-09T07:38:21.337 に答える
0

あなたの質問は不明確です。RGB のどの色も「負の色」ではありません。

フィルムのネガであるかのように、イメージを反転できます。そうですか?

色が 1 ピクセルしかない画像を反転したい場合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 に答える
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 に答える