どのように私は色を反転しますか?
-
19-09-2019 - |
質問
私は、これは直接色を反転しないことを知って、それはそれは「反対」します。誰もが任意の色から色を反転するための簡単な方法(数行のコードを)知っていた場合、私は不思議でしたか?
私は(私はそれをグレー/灰色を渡す場合、それは非常に似例えば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);
}