web-dev-qa-db-ja.com

色を反転するにはどうすればよいですか?

これは色を直接反転させず、単に「反対」することを知っています。特定の色から色を反転させる簡単な方法(数行のコード)を知っている人がいるのだろうかと思いました。

現時点ではこれがあります(反転の定義ではありません。グレー/グレーの色を渡すと、非常によく似たもの、たとえば127、127、127が返されるためです):

const int RGBMAX = 255;

Color InvertMeAColour(Color ColourToInvert)
{
    return Color.FromArgb(RGBMAX - ColourToInvert.R, 
      RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
37
Lloyd Powell

それはあなたが色を「反転させる」という意味に依存します

コードは「負の」色を提供します。

シアンの赤、紫の緑、黄色の青(など)の変換をお探しですか?その場合、RGBカラーを [〜#〜] hsv [〜#〜] モードで変換する必要があります(変換を行うには here があります)。

次に、色相の値を反転し(Hue360-Hueで変更)、RGBモードに戻すだけです。

編集:Alex Semeniukが述べたように、Hue(Hue + 180) % 360で変更することは、より良い解決策です(色相を反転させませんが、カラーサークルで反対の色を見つけます)。

47
ThibThib

以下を使用できます。

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

MyColorが反転します。

21
Remy

これを試して:

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

すべての色を変更する場合は、反転関数(反転)ではなく、回転関数(シフトまたは追加)を試してください。つまり、値の円のような先端で接続され、ラップされる各単色(赤、緑、青)の0〜255の範囲を考慮します。次に、値を追加してmod 256を実行することにより、円の周りの各色をシフトします。たとえば、赤の開始値が255で、1を追加すると0になります。3色すべてを128シフトすると、劇的に異なります画像内のすべての元の色の値(グレーを含む)。グレー127、127、127は白255、255、255になります。グレー128、128、128は黒0、0、0になります。1930年代にマンレイが偶然発見した、ソラリゼーションと呼ばれるような写真効果があります。

また、各色(赤、緑、青)で異なる量だけ回転操作を行って、実際に画像を台無しにすることもできます。

また、色相の回転操作を行うことで、すべての元の色の色相を色相環上である程度シフトし、明るさを変更せずにすべての色を変更するため、影は依然として影のように見え、人々はシンプソンまたはスマーフのように見えます例。

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

各コンポーネントのビットを個別に反転します。

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

編集:〜演算子はバイトを自動的に処理しないため、キャストが必要です。

5
Kenan E. K.

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

しかし、対照的な色が必要なようです。RGB(127、127、127)を含むすべての色で機能する単純な反転はありません。

必要なのは、1)HSVへの変換(ThibThibsの回答を参照)と色相の反転だけでなく、2)色相が中央に近づいていないかどうかを確認し、そうであれば、完全に明るいか完全に暗いかのいずれかになることです。

5
Henk Holterman

トリプル12xだけでなく、混在した値を持つことで動作するようにした最も簡単で怠zyな方法は次のとおりです。

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、またはそれに近い場合でも、元の色とは異なります。

1
Christos Lytras

VB.NET用に次の簡単な関数を作成しました。

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

そして、これはC#用です:

public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}