如何反转颜色?(How do I invert a colour?)

2019-06-17 13:05发布

我知道这不会直接反转颜色,它只会“反对”吧。 我想知道是否有人知道一个简单的方法(的几行代码)反转从任何给定颜色的颜色?

目前,我有这样的(这是不完全的反转的定义,因为如果我传递一个灰色/灰色它将返回极其类似的东西如127,127,127):

const int RGBMAX = 255;

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

Answer 1:

这取决于你所说的“反向”做一个颜色

您的代码提供了一个“负”的色彩。

您是否正在寻找变换红青,绿紫色,蓝色黄色(等)? 如果是这样,你需要在你的RGB颜色转换成HSV模式(你会发现这里来进行转型)。

然后你只需要(变反转色调值Hue360-Hue )和转换回RGB模式。

编辑:如亚历Semeniuk提及,改变Hue(Hue + 180) % 360是更好的解决方案(它不反转色调,但发现在彩色圆相对的颜色)



Answer 2:

您可以使用 :

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

这将反转MyColor。



Answer 3:

试试这个:

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


Answer 4:

倒置分开各成分的位:

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

编辑:〜运营商不与字节自动工作,需要演员。



Answer 5:

你已经拥有的是RGB-反转。 还有其他的方法进行分类的颜色,因此其他定义的颜色的反。

但是,它听起来就像也许你想对比色,并没有说是要为所有的颜色包括RGB(127,127,127)运行的一个简单反转。

你需要的是1)转换到HSV(见ThibThibs答案)和反转色调,而且2)检查色调是不要靠近中间,如果是去要么完全亮或暗充分。



Answer 6:

如果你想改变每一个颜色,试试旋转功能(移动或增加),而不是翻转功能(反转)。 换言之,考虑为0〜255的范围内对各单色(红,绿和蓝)被包裹,在像值的圆的尖端相连。 然后围绕cirle每种颜色增加了一些价值,做模256例如,如果你的红起始值为255,你加1,你得到0。如果通过128转移所有三种颜色转变,你会得到显着的不同对每个原始颜色的图像值,甚至是灰色。 灰色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);
    }
}


Answer 7:

最简单,最偷懒的方法我把它用,其不仅具有三倍12X工作,但混合的值,是这样的:

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或接近它的颜色值。



Answer 8:

我创建了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);
}


文章来源: How do I invert a colour?