Invert a Color in C#

A very quick code snippet for you all today. I had encountered an issue where I needed to invert the text color from the background (color was changing consistently from the user). So after some googling and playing around, I created something to do just that for me.

First we needed a method to take convert our color to a hex string :

//Modified from
private static Color HexToColor(string hexColor)
	//Remove # if present
	if (hexColor.IndexOf('#') != -1)
		hexColor = hexColor.Replace("#", "");

	byte red = 0;
	byte green = 0;
	byte blue = 0;

	if (hexColor.Length == 8)
		//We need to remove the preceding FF
		hexColor = hexColor.Substring(2);

	if (hexColor.Length == 6)
		red = byte.Parse(hexColor.Substring(0, 2), NumberStyles.AllowHexSpecifier);
		green = byte.Parse(hexColor.Substring(2, 2), NumberStyles.AllowHexSpecifier);
		blue = byte.Parse(hexColor.Substring(4, 2), NumberStyles.AllowHexSpecifier);
	else if (hexColor.Length == 3)
		red = byte.Parse(hexColor[0].ToString() + hexColor[0].ToString(), NumberStyles.AllowHexSpecifier);
		green = byte.Parse(hexColor[1].ToString() + hexColor[1].ToString(), NumberStyles.AllowHexSpecifier);
		blue = byte.Parse(hexColor[2].ToString() + hexColor[2].ToString(), NumberStyles.AllowHexSpecifier);

	return Color.FromRgb(red, green, blue);

Then we can do the inversion :

private Brush invertColor(string value)
	if (value != null)
		Color ColorToConvert = HexToColor(value);
		Color invertedColor = Color.FromRgb((byte)~ColorToConvert.R, (byte)~ColorToConvert.G, (byte)~ColorToConvert.B);
		return new SolidColorBrush(invertedColor);
		return new SolidColorBrush(Color.FromRgb(0,0,0));

Finally for the example of use, we can just set the foreground from the background (or whatever you need done)

//TestLabel is just a label on the wpf form
//mainGrid is the main grid on the wpf form
TestLabel.Foreground = invertColor(mainGrid.Background.ToString());

There you go, an inverted color. Happy coding and HTH!

Releated Post

Leave a Reply

%d bloggers like this: