2009-07-22 7 views
28

私はこれが直接色を逆転させないことを知っています、それは単にそれに反対します。任意の色から色を反転させる簡単な方法(数行のコード)を誰かが知っていたのでしょうか?どのように色/色を反転させるのですか?

const int RGBMAX = 255; 

Color InvertMeAColour(Color ColourToInvert) 
{ 
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
     RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B); 
} 
:私は(私はそれをグレー/グレー色を渡すと、それが何か非常に似て例えば127、127、127を返しますので、正確に反転の定義されていない)、これを持っている時点では

+8

実際には、色を反転させる方法が通常定義されています。代わりに何を探していますか? –

+0

私の色が127,127,127の場合、私の関数を通ってそれを反転させることはできません。 – ThePower

+1

与えられた色を読み込むことができるかもしれない背景色を生成する必要がありますか? –

答えて

41

それはあなたが色

あなたのコードが「負」の色を提供し、「反転」によって意味ですか何に依存します。

シアン、グリーン、パープル、ブルー(イエロー)などの赤のトランスフォームをお探しですか?その場合は、HSVモードでRGBカラーを変換する必要があります(変換するにはhereがあります)。

次に、色相値を逆にして(Hue360-Hueに変更)、RGBモードに戻します。

EDIT:アレックスSemeniukが述べたように、(Hue + 180) % 360によってHueを変更することがよりよい解決策である(それは色相を反転さが、カラーサークル上の反対の色を見つけることができません)

+0

うん、最後に意味のある答え。 +1 – jalf

+1

+1実際に私の質問に正しい解決策で回答してください(私が投稿したコードの代替案を提供するのではなく) – ThePower

+0

これを組み合わせてhttp://stackoverflow.com/questions/2942/hsl-in-net/2504318 #2504318は私が行ったこととまったく同じです。ありがとう! – Yoopergeek

10

これを試してください:各成分の

uint InvertColor(uint rgbaColor) 
{ 
    return 0xFFFFFF00u^rgbaColor; // Assumes alpha is in the rightmost byte, change as needed 
} 
+0

それはC#で同じように行われます。構文はまったく同じです。 0xFFFFFFFF^color –

+0

ほぼ同じです。 :)私はちょうどそれをC#に変えるためにマイナーな変更を加えました。 – Noldorin

+3

これは質問 – Eyal

4

反転ビットを別々:

Color InvertMeAColour(Color ColourToInvert) 
{ 
    return Color.FromArgb((byte)~ColourToInvert.R, (byte)~ColourToInvert.G, (byte)~ColourToInvert.B); 
} 

編集:〜演算子はバイトで自動的に動作しません、キャストが必要です。

+0

これは例外をスローします(ArgumentException "値 '-129'は 'red'には有効ではありません) – ThePower

+0

これは訂正された答えです。 –

+0

今それは良くなっていますが、それは私の機能と同じように、否定ではなく反転ではありません。とにかく答えをありがとう:-) – ThePower

4

すでにRGB-で持って何反転する。色を分類する他の方法、それゆえInverse of a Colorの他の定義があります。

しかし、コントラストのある色がほしいと思うし、RGB(127,127,127)を含むすべての色で機能する単純な反転はありません。

あなたが必要とするのは、1)HSVへの変換(ThibThibsの回答を参照)と色相の反転だけでなく、2)色相が中間に近づかないかどうかを確認し、完全に明るくまたは完全にダーク。

+1

固定小数点定理は、(実数値の)ColorからColorへの任意の連続関数は1つの値を変更せずに残すことを意味し、関数が合理的に滑らかであれば、その点を中心とするパッチもほとんど動かないでしょう –

14

あなたは使用することができます。

MyColor=Color.FromArgb(MyColor.ToArgb()^0xffffff); 

それはMyColorを反転します。

+6

したがって、 127,127,127? – ThePower

+1

少し明るい灰色になります:128,128,128 – Jerther

+1

これは多くの場合、非常に良い答えだと思います。たとえば、赤はシアンに変換されます。 Remyのコードに相当するvbnetです: 'MyColor = Color.FromArgb(MyColor.ToArgb()Xor&Hffffff)' – Alex

3

すべての色を変更したい場合は、反転機能(反転)ではなく回転機能(シフトまたは追加)を試してください。言い換えれば、ラウンドされる各単色(赤、緑、青)の0〜255の範囲を、値の円のような先端で接続します。たとえば、赤の開始値が255で、1を加算すると0が得られます。3つの色すべてを128でシフトすると、劇的に異なります画像内の元の色、グレイまでのすべての値。灰色127,127,127は白255,255,255になります。灰色128,128,128は黒色0,0,0になります。1930年代にMan Rayによって偶発的に発見されたSolarizationと呼ばれる写真効果があります。

各色(赤、緑、青)の回転操作を異なる量だけ行うこともできます。

また、元の色の色相を色相円上にいくつか移動させることで、明るさを変更せずにすべての色を変更することができるため、影は影のように見えます。例えばシンプソンズまたはスムース(Smurphs)。

public static Color Invert(this Color c) => Color.FromArgb(c.R.Invert(), c.G.Invert(), c.B.Invert()); 

public static byte Invert(this byte b) { 
    unchecked { 
     return (byte)(b + 128); 
    } 
} 
1

最もシンプルかつ怠惰な方法は、私だけではなく、トリプル12倍を持って動作するようにそれを作ったが、混合値、このです:

128によるシフトのためのコードは次のようになります

Color invertedColor= Color.FromArgb(fromColor.ToArgb()^0xffffff); 

if (invertedColor.R > 110 && invertedColor.R < 150 && 
    invertedColor.G > 110 && invertedColor.G < 150 && 
    invertedColor.B > 110 && invertedColor.B < 150) 
{ 
    int avg = (invertedColor.R + invertedColor.G + invertedColor.B)/3; 
    avg = avg > 128 ? 200 : 60; 
    invertedColor= Color.FromArgb(avg, avg, avg); 
} 

ここで、invertedColorは、128,128,128またはそれに近い色の値を持っていても元の色とは異なる色をしています。

関連する問題