質問

私は、これは直接色を反転しないことを知って、それはそれは「反対」します。誰もが任意の色から色を反転するための簡単な方法(数行のコードを)知っていた場合、私は不思議でしたか?

私は(私はそれをグレー/灰色を渡す場合、それは非常に似例えば127、127、127が返されるので、正確に反転の定義されていない)、これを持っている時点で

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
役に立ちましたか?

解決

それはあなたが色

「反転」によって意味ですかものに依存します

あなたのコードは、 "負" の色を提供しています。

あなたは(など)、シアン赤紫、緑、黄色、青変換をお探しですか?もしそうなら、あなたは HSV のモードであなたのRGBの色を変換する必要があります(あなたが見つかりますここに作ることを変換)。

次に、あなただけの色相値(Hueによって変更360-Hue)を反転し、RGBモードに戻って変換する必要があります。

編集:アレックスSemeniukが述べたように、Hueによって(Hue + 180) % 360を変更する優れたソリューションである(それは色相を反転するが、カラーサークル上の反対の色を見つけることができません)

他のヒント

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

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

これはMyColorを反転します。

これを試してください:

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

別々に各成分のビットを反転

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

EDIT:〜演算子は自動的にバイトでは動作しません、キャストが必要とされている。

あなたがすでに持っていることはRGB-反転です。色の逆の色、したがって、他の定義を分類する他の方法があります。

しかし、多分あなたは対照的な色をしたい、とRGB(127、127、127)を含む、すべての色のために仕事に行くされ、単純な反転がないように聞こえます。

フエので、完全に明るいか暗い完全のいずれかに行けば真ん中に閉じて、しない場合は、1)HSVへの変換(ThibThibs答えを参照)と反転色相が、また、2)がチェックされる必要なもの。

あなたはすべての色を変更したい場合は、

、回転機能(シフトまたは追加する)のではなく反転機能(反転)をしてみてください。換言すれば、値の円のような先端に接続された各単色(赤、緑、青)がラップされる、0〜255の範囲を検討します。そして、あなたが128で全3色をシフトした場合、あなたは劇的に異なる取得赤のためのあなたの開始値が255で、あなたは1を追加した場合、あなたは0を取得し、いくつかの値を追加して、たとえば、MOD 256を行うことによってcirleの周りに各色をシフト画像内のすべての元の色の値もグレー。グレー127、127、127が白255となり、255、255グレー128、128、128が黒0となり、0、0はそのような写真の効果は、1930年代にマン・レイによって偶然発見された、ソラリゼーションが呼ばれています。

また、異なる量に本当に台無し画像で各色に(赤、緑、青)の回転操作を行うことができます。

また、明るさを変更することなく、すべての色を変える色相環、上のいくつかの量によって、すべての元の色の色相をずらし、色相に回転操作を行うことができますので、影はまだ人々がシンプソンズのように見えるように、影のように見えますまたはSmurphsたとえばます。

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

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);
    }
}

私はそれは、だけでなく、三重の12倍を持つが、混合値を動作するように作られた最もシンプルかつ怠惰な方法は、この次のとおりです。

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またはそれに近い色値を持っている場合でも、オリジナルの別の色を持っています。

私はVB.NETのために、この簡単な関数を作成しました

Public Shared Function Invert(ByVal Culoare As Color) As Color
    Return Color.FromArgb(Culoare.ToArgb() Xor &HFFFFFF)
End Function

とC#のために、この1:

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top