我知道这不会直接反转颜色,它只会“反对”吧。 我想知道是否有人知道一个简单的方法(的几行代码)反转从任何给定颜色的颜色?
目前,我有这样的(这是不完全的反转的定义,因为如果我传递一个灰色/灰色它将返回极其类似的东西如127,127,127):
const int RGBMAX = 255;
Color InvertMeAColour(Color ColourToInvert)
{
return Color.FromArgb(RGBMAX - ColourToInvert.R,
RGBMAX - ColourToInvert.G, RGBMAX - ColourToInvert.B);
}
这取决于你所说的“反向”做一个颜色
您的代码提供了一个“负”的色彩。
您是否正在寻找变换红青,绿紫色,蓝色黄色(等)? 如果是这样,你需要在你的RGB颜色转换成HSV模式(你会发现这里来进行转型)。
然后你只需要(变反转色调值Hue
由360-Hue
)和转换回RGB模式。
编辑:如亚历Semeniuk提及,改变Hue
由(Hue + 180) % 360
是更好的解决方案(它不反转色调,但发现在彩色圆相对的颜色)
您可以使用 :
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-反转。 还有其他的方法进行分类的颜色,因此其他定义的颜色的反。
但是,它听起来就像也许你想对比色,并没有说是要为所有的颜色包括RGB(127,127,127)运行的一个简单反转。
你需要的是1)转换到HSV(见ThibThibs答案)和反转色调,而且2)检查色调是不要靠近中间,如果是去要么完全亮或暗充分。
如果你想改变每一个颜色,试试旋转功能(移动或增加),而不是翻转功能(反转)。 换言之,考虑为0〜255的范围内对各单色(红,绿和蓝)被包裹,在像值的圆的尖端相连。 然后围绕cirle每种颜色增加了一些价值,做模256例如,如果你的红起始值为255,你加1,你得到0。如果通过128转移所有三种颜色转变,你会得到显着的不同对每个原始颜色的图像值,甚至是灰色。 灰色127,127,127变成白色255,255,255。128灰度,128个,128个变成了黑色0,0,0。有这样的所谓的日晒,意外在1930年发现了曼·雷拍摄效果。
您还可以通过不同的量真的会打乱的图片做每一种颜色(红,绿,蓝)的旋转操作。
你也可以做旋转动作的色调,通过在色相环,这会改变所有的颜色不改变亮度一定量移逢原颜色的色调,这样的阴影仍然看起来像阴影,让人们看起来像辛普森或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);
}
}
最简单,最偷懒的方法我把它用,其不仅具有三倍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);
}
现在, 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#:
public static Color Invert(Color Culoare)
{
return Color.FromArgb(Culoare.ToArgb() ^ 0xFFFFFF);
}