# c# – Convert System.Drawing.Color to RGB and Hex Value

## The Question :

134 people think this question is useful

Using C# I was trying to develop the following two. The way I am doing it may have some problem and need your kind advice. In addition, I dont know whether there is any existing method to do the same.

private static String HexConverter(System.Drawing.Color c)
{
String rtn = String.Empty;
try
{
rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}
catch (Exception ex)
{
//doing nothing
}

return rtn;
}

private static String RGBConverter(System.Drawing.Color c)
{
String rtn = String.Empty;
try
{
rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}
catch (Exception ex)
{
//doing nothing
}

return rtn;
}



Thanks.

218 people think this answer is useful

I’m failing to see the problem here. The code looks good to me.

The only thing I can think of is that the try/catch blocks are redundant — Color is a struct and R, G, and B are bytes, so c can’t be null and c.R.ToString(), c.G.ToString(), and c.B.ToString() can’t actually fail (the only way I can see them failing is with a NullReferenceException, and none of them can actually be null).

You could clean the whole thing up using the following:

private static String HexConverter(System.Drawing.Color c)
{
return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}

private static String RGBConverter(System.Drawing.Color c)
{
return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}



197 people think this answer is useful

You could keep it simple and use the native color translator:

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);



Then break the three color pairs into integer form:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);



43 people think this answer is useful

If you can use C#6 or higher, you can benefit from Interpolated Strings and rewrite @Ari Roth’s solution like this:

C# 6 :

public static class ColorConverterExtensions
{
public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}"; public static string ToRgbString(this Color c) =>$"RGB({c.R}, {c.G}, {c.B})";
}



Also:

• I add the keyword this to use them as extensions methods.
• We can use the type keyword string instead of the class name.
• We can use lambda syntax.
• I rename them to be more explicit for my taste.

27 people think this answer is useful

e.g.

 ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))



This can avoid the KnownColor trick.

2 people think this answer is useful

1. Get ARGB (Alpha, Red, Green, Blue) representation for the color
2. Filter out Alpha channel: & 0x00FFFFFF
3. Format out the value (as hexadecimal “X6” for hex)

For RGB one

1. Just format out Red, Green, Blue values

Implementation

private static string HexConverter(Color c) {
return String.Format("#{0:X6}", c.ToArgb() &amp; 0x00FFFFFF);
}

public static string RgbConverter(Color c) {
return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B);
}



1 people think this answer is useful

I found an extension method that works quite well

public static string ToHex(this Color color)
{
return String.Format("#{0}{1}{2}{3}"
, color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X")
, color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X")
, color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X")
, color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X"));
}