如何反转颜色?

Llo*_*ell 39 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*hib 47

这取决于你"反转"一种颜色是什么意思

您的代码提供"负面"颜色.

您是在寻找青色的变换红色,紫色的绿色,黄色的蓝色(等等)?如果是这样,您需要在HSV模式下转换RGB颜色(您可以在此处找到进行转换).

然后你只需要反转色彩值(变动Hue360-Hue),并重新转换为RGB模式.

编辑:亚历克斯Semeniuk提到,改变Hue(Hue + 180) % 360是更好的解决方案(它不倒置色调,但发现在色环相反的颜色)

  • 不正确.如果你想通过仅改变'Hue`来"反转"HSV颜色,你应该使用`(Hue + 180)%360`,而不是'360 - Hue`.这样你的Hue为180时就没有"问题"(不是说你会正确地接受**倒置的颜色). (4认同)
  • 实际使用正确的解决方案回答我的问题+1(而不是提供我发布的代码的替代方案) (2认同)
  • 当Hue = 180时会发生什么?颜色保持不变? (2认同)

小智 23

您可以使用 :

MyColor=Color.FromArgb(MyColor.ToArgb()^0xffffff);
Run Code Online (Sandbox Code Playgroud)

它将反转MyColor.

  • 那么,这对灰色有什么影响?127,127,127? (9认同)
  • 它给出了稍浅的灰色:128,128,128 (4认同)
  • 我认为这在很多情况下都是一个很好的答案。例如,红色将转换为青色。这是Remy代码的vbnet等效项:MyColor = Color.FromArgb(MyColor.ToArgb()Xor&Hffffff) (2认同)

kor*_*ona 11

试试这个:

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

  • 这与问题中的代码相同 (3认同)

Ken*_* K. 5

分别反转每个组件的位:

Color InvertMeAColour(Color ColourToInvert)
{
   return Color.FromArgb((byte)~ColourToInvert.R, (byte)~ColourToInvert.G, (byte)~ColourToInvert.B);
}
Run Code Online (Sandbox Code Playgroud)

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


Hen*_*man 5

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

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

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

  • 不动点定理意味着从(实值)Color 到 Color 的任何连续函数都会使一个值保持不变;如果该函数是一个相当平滑的函数,那么该点周围的补丁也不会移动太多。 (2认同)

小智 5

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

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

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