Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反转颜色?_C#_.net_Colors_System.drawing.color_Invert - Fatal编程技术网

C# 如何反转颜色?

C# 如何反转颜色?,c#,.net,colors,system.drawing.color,invert,C#,.net,Colors,System.drawing.color,Invert,我知道这不会直接反转颜色,它只会“反对”它。我想知道是否有人知道一种简单的方法(几行代码)来从任何给定的颜色转换颜色 目前我有这个(这并不完全是反转的定义,因为如果我给它一个灰色/灰色,它将返回非常相似的东西,例如127、127、127): 试试这个: uint InvertColor(uint rgbaColor) { return 0xFFFFFF00u ^ rgbaColor; // Assumes alpha is in the rightmost byte, change as

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

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

试试这个:

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);
}

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

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

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

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

然后您只需将色调值反转(通过
360色调
更改
Hue
)并转换回RGB模式


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

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

但听起来你可能想要一种对比色,而且没有一个简单的反转可以适用于包括RGB(127127127)在内的所有颜色

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

您可以使用:

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

它将反转MyColor。

如果要更改每种颜色,请尝试旋转功能(移动或添加)而不是翻转功能(反转)。换言之,考虑每一种颜色(红色、绿色和蓝色)的0到255的范围,它们被包装成一个圆圈。然后通过添加一些值并执行mod 256,围绕圆环移动每个颜色。例如,如果红色的起始值为255,加上1,则得到0。如果将所有三种颜色移动128,则图片中每种原始颜色的值都会显著不同,甚至灰度也是如此。灰色127、127、127变为白色255、255、255。灰色128、128、128变为黑色0、0、0。有一种叫做日晒的摄影效果,是曼雷在20世纪30年代偶然发现的

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

您还可以对色调执行旋转操作,将每个原始颜色的色调在色调圈上移动一定量,从而在不改变亮度的情况下改变所有颜色,因此阴影仍然看起来像阴影,例如,使人看起来像辛普森或蓝精灵

移位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);
    }
}

我使用的最简单、最懒惰的方法,不仅是三重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);
}
Color invertedColor=Color.FromArgb(fromColor.ToArgb()^0xffffff);
如果(反相器颜色R>110和反相器颜色R<150&&
反相器颜色.G>110和反相器颜色.G<150&&
invertedColor.B>110和&invertedColor.B<150)
{
int avg=(invertedColor.R+invertedColor.G+invertedColor.B)/3;
平均值=平均值>128?200:60;
反相器颜色=颜色。来自argb(平均值,平均值,平均值);
}

现在,
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的:


事实上,这就是通常定义反转颜色的方式。。。你在寻找什么呢?也许你需要生成一个背景色,你给定的颜色可以在上面阅读?那么,灰色的反面应该是什么呢?;)暗灰色的反面是明亮的红色,或者是漂亮的绿色。@ThePower:127127的颜色反比是128128。尽管这在你看来可能令人失望……但在C#中也是如此。语法完全相同。0xFFFFFF^颜色几乎相同。:)我只是做了一些小改动,把它变成了C#。@Eyal,不,它不一样。这里使用XOR操作代替-。thx,它保持alpha不变!(在JavaJMonKeyEngine中ColorRGBA:)是的,最后是一个有意义的答案+1+1用正确的解决方案回答我的问题(而不是提供我发布的代码的替代方案),当色调=180时会发生什么?颜色保持不变?正如Steve Gilham所说:“不动点定理意味着从(实值)颜色到颜色的任何连续函数将保持一个值不变;如果函数是一个相当平滑的函数,那么该点周围的补丁也不会移动太多。”因此色调=180的颜色不会改变。不正确。如果您只想通过更改
色调来“反转”HSV颜色,则应使用
(色调+180)%360
,而不是
360-色调
。这样,当色调为180时,您将不会遇到“问题”(并不是说您将收到正确的反转颜色)。这会引发一个异常(ArgumentException“值“-129”对“红色”无效)。现在它已被编辑,这会更好,尽管它仍然与我的函数一样,是负数,而不是反转。不管怎样,谢谢你的回答:-)不动点定理意味着从(实值)颜色到颜色的任何连续函数都会保持一个值不变;如果函数是一个相当平滑的函数,那么围绕该点的补丁也不会移动太多。那么,这对灰色有什么影响呢?127,127,127?它给出了一个稍微浅一点的灰色:128,128,128我认为这对于许多情况来说是一个非常好的答案。例如,红色将转换为青色。这是雷米代码的vbnet等价物:
MyColor=Color.FromArgb(MyColor.ToArgb()Xor&Hffffff)
Public Shared Function Invert(ByVal Culoare As Color) As Color
    Return Color.FromArgb(Culoare.ToArgb() Xor &HFFFFFF)
End Function
public static Color Invert(Color Culoare)
{
    return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}