如何反转颜色?

时间:2009-07-22 13:01:45

标签: c# .net colors system.drawing.color invert

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

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

const int RGBMAX = 255;

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

8 个答案:

答案 0 :(得分:47)

这取决于“反转”颜色是什么意思

您的代码提供“负面”颜色。

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

然后您只需要反转Hue值(将Hue更改为360-Hue)并转换回RGB模式。

编辑:正如Alex Semeniuk所提到的,将Hue更改为(Hue + 180) % 360是一个更好的解决方案(它不会反转Hue,但会在色环上找到相反的颜色)

答案 1 :(得分:19)

您可以使用:

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

它会反转MyColor。

答案 2 :(得分:10)

试试这个:

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

答案 3 :(得分:5)

分别反转每个组件的位:

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

编辑:〜运算符不能自动处理字节,需要强制转换。

答案 4 :(得分:5)

你已经拥有RGB-Invert。还有其他方法可以对颜色进行分类,从而对颜色的反转进行其他定义。

但听起来好像你想要一个对比色,而且没有一个简单的反转可以适用于所有颜色,包括RGB(127,127,127)。

你需要的是1)转换为HSV(参见ThibThibs答案)并颠倒Hue,但也2)检查Hue是否不接近中间,如果是,则转到完全明亮或完全黑暗。

答案 5 :(得分:5)

如果要更改每种颜色,请尝试旋转功能(移位或添加)而不是翻转功能(反转)。换句话说,考虑要包装的每种颜色(红色,绿色和蓝色)的0到255范围,在尖端处连接,如值圆。然后通过添加一些值并执行mod 256来移动每个颜色。例如,如果红色的起始值是255,并且您添加1,则得到0.如果将所有三种颜色移动128,则会发生显着不同图片中每种原始颜色的值,甚至是灰色。灰色127,127,127变为白色255,255,255。灰色128,128,128变为黑色0,0,0。这样的摄影效果就像所谓的日晒,由Man Ray在1930年偶然发现&# 39; S

您还可以对每种颜色(红色,绿色,蓝色)进行不同量的旋转操作,以便真正搞乱图片。

您还可以在色调上进行旋转操作,在色调圆上将每种原始色调的色调移动一定量,这会改变所有颜色而不会改变亮度,因此阴影仍然看起来像阴影,使人看起来像辛普森一家或者以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);
    }
}

答案 6 :(得分:1)

最简单和懒惰的方式我不仅使用三倍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或接近它的颜色值。

答案 7 :(得分:0)

我已经为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);
}