我知道这不会直接反转颜色,它只会'反对'它。我想知道是否有人知道一种简单的方法(几行代码)来反转任何给定颜色的颜色?
目前我有这个(这不完全是反转的定义,因为如果我传递灰色/灰色,它将返回非常相似的东西,例如127,127,127):
const int RGBMAX = 255;
Color InvertMeAColour(Color ColourToInvert)
{
return Color.FromArgb(RGBMAX - ColourToInvert.R,
RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
答案 0 :(得分:47)
这取决于“反转”颜色是什么意思
您的代码提供“负面”颜色。
您是在寻找青色的变换红色,紫色的绿色,黄色的蓝色(等等)?如果是这样,您需要在HSV模式下转换RGB颜色(您会发现here进行转换)。
然后您只需要反转Hue值(将Hue
更改为360-Hue
)并转换回RGB模式。
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);
}