43

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

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

const int RGBMAX = 255;

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

8 回答 8

50

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

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

您是否正在寻找青色中的红色、紫色中的绿色、黄色中的蓝色(等等)?如果是这样,您需要在HSV模式下转换您的 RGB 颜色(您将在此处找到进行转换)。

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

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

于 2009-07-22T13:08:44.773 回答
32

您可以使用 :

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

它将反转 MyColor。

于 2013-04-26T21:10:44.253 回答
11

试试这个:

uint InvertColor(uint rgbaColor)
{
    return 0xFFFFFF00u ^ rgbaColor; // Assumes alpha is in the rightmost byte, change as needed
}
于 2009-07-22T13:04:48.050 回答
7

如果您想更改每种颜色,请尝试使用旋转功能(移位或添加)而不是翻转功能(反转)。换句话说,考虑每一种颜色(红色、绿色和蓝色)的 0 到 255 的范围,它们像一圈值一样在尖端连接。然后通过添加一些值并执行 mod 256 来移动圆圈周围的每种颜色。例如,如果红色的起始值为 255,然后添加 1,则得到 0。如果将所有三种颜色都移动 128,则会得到显着不同图片中每种原始颜色的值,甚至是灰色。灰色 127, 127, 127 变成白色 255, 255, 255。灰色 128, 128, 128 变成黑色 0, 0, 0。 有一种称为曝光的摄影效果,是 Man Ray 在 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);
    }
}
于 2014-10-14T16:32:03.967 回答
6

分别反转每个分量的位:

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

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

于 2009-07-22T13:07:33.370 回答
5

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

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

您需要的是 1)转换为 HSV(请参阅 ThibThibs 答案)并反转色调,而且 2)检查色调是否靠近中间,如果是,则转到完全明亮或完全黑暗。

于 2009-07-22T13:30:17.140 回答
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 或接近它的颜色值。

于 2015-12-05T15:08:58.090 回答
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);
}
于 2019-01-07T16:18:38.523 回答