C# 如何反转颜色?
我知道这不会直接反转颜色,它只会“反对”它。我想知道是否有人知道一种简单的方法(几行代码)来从任何给定的颜色转换颜色 目前我有这个(这并不完全是反转的定义,因为如果我给它一个灰色/灰色,它将返回非常相似的东西,例如127、127、127): 试试这个: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
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);
}