如何反转颜色/颜色?
我知道这不会直接颠倒一种颜色,只会“反对”它。 我想知道是否有人知道一个简单的方法(几行代码)来反转任何给定颜色的颜色?
目前,我有这个(这不完全是一个倒置的定义,因为如果我通过它灰色/灰色,它会返回一些非常相似的东西,例如127,127,127):
const int RGBMAX = 255; Color InvertMeAColour(Color ColourToInvert) { return Color.FromArgb(RGBMAX - ColourToInvert.R, RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B); }
这取决于你什么意思是“反转”一种颜色
你的代码提供了一个“负面”的颜色。
你在寻找变换红色的青色,绿色的紫色,蓝色的黄色(依此类推)? 如果是这样,你需要在HSV模式下转换你的RGB颜色(你会发现在这里进行转换)。
那么你只需要反转Hue值(改变Hue
360-Hue
)并转换回RGB模式。
编辑:如亚历Semeniuk提到,改变Hue
(Hue + 180) % 360
是一个更好的解决scheme(它不颠倒色相,但在彩色圆圈上find相反的颜色)
您可以使用 :
MyColor=Color.FromArgb(MyColor.ToArgb()^0xffffff);
它会颠倒MyColor。
尝试这个:
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-Invert。 还有其他方法可以对颜色进行分类,因此也可以使用其他颜色的反向定义。
但是这听起来像也许你想要一个对比的颜色,并没有一个简单的反转,将适用于所有颜色,包括RGB(127,127,127)。
你需要的是:1)转换成HSV(见ThibThibs答案),颠倒色调,但也2)检查色相是否不接近中间,如果是这样,去完全明亮或完全黑暗。
如果你想改变每种颜色,尝试一个旋转function(移动或添加),而不是翻转function(反转)。 换句话说,对于每一种颜色(红色,绿色和蓝色),要考虑0到255的范围来包装,像一圈值的连接点。 然后,通过增加一些值,并在256模式中移动每个颜色。例如,如果你的红色起始值是255,而你加1,你得到0.如果你将所有三种颜色移动128,你会有很大的不同图片中每个原始颜色的值,甚至灰色。 灰127,127,127变成白255,255,255。灰128,128,128变成黑0,0,0。有一种类似于被称为日光化的照片效果,在1930年由曼·雷意外发现。
您也可以对每种颜色(红色,绿色,蓝色)进行不同的旋转操作,以便真正搞乱图片。
你也可以对色调进行旋转操作,在色调圆上移动每个原始颜色的色调,这会改变所有的颜色而不会改变亮度,所以阴影仍然看起来像阴影,使人看起来像辛普森或斯穆夫斯为例。
128位移位的代码可能如下所示:
public static Color Invert(this Color c) => Color.FromArgb(cRInvert(), cGInvert(), cBInvert()); public static byte Invert(this byte b) { unchecked { return (byte)(b + 128); } }
最简单和懒惰的方式,我使它不仅具有三重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); }
现在,即使我们有一个128,128,128或接近它的颜色值, invertedColor
也具有与原始颜色不同的颜色。