How do I get the color from a hexadecimal color code using .NET?

Viewed 620346

How can I get a color from a hexadecimal color code (e.g. #FFDFD991)?

I am reading a file and am getting a hexadecimal color code. I need to create the corresponding System.Windows.Media.Color instance for the hexadecimal color code. Is there an inbuilt method in the framework to do this?

20 Answers

I'm assuming that's an ARGB code... Are you referring to System.Drawing.Color or System.Windows.Media.Color? The latter is used in WPF for example. I haven't seen anyone mention it yet, so just in case you were looking for it:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");

Assuming you mean the HTML type RGB codes (called Hex codes, such as #FFCC66), use the ColorTranslator class:

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");

If, however you are using an ARGB hex code, you can use the ColorConverter class from the System.Windows.Media namespace:

Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;

If you don't want to use the ColorTranslator, you can do it in easily:

string colorcode = "#FFFFFF00";
int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
Color clr = Color.FromArgb(argb);

The colorcode is just the hexadecimal representation of the ARGB value.

EDIT

If you need to use 4 values instead of a single integer, you can use this (combining several comments):

string colorcode = "#FFFFFF00";    
colorcode = colorcode.TrimStart('#');

Color col; // from System.Drawing or System.Windows.Media
if (colorcode.Length == 6)
    col = Color.FromArgb(255, // hardcoded opaque
                int.Parse(colorcode.Substring(0,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2,2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4,2), NumberStyles.HexNumber));
else // assuming length of 8
    col = Color.FromArgb(
                int.Parse(colorcode.Substring(0, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(2, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(4, 2), NumberStyles.HexNumber),
                int.Parse(colorcode.Substring(6, 2), NumberStyles.HexNumber));

Note 1: NumberStyles is in System.Globalization.
Note 2: please provide your own error checking (colorcode should be a hexadecimal value of either 6 or 8 characters)

in asp.net:

color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");

Use

System.Drawing.Color.FromArgb(myHashCode);

You can use the ColorConverter.ConvertFromString(string) method which converts your string (hexadecimal) to the color.

Example: (This works with ARGB, like "#FF1E1E1E".

Control.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1E1E1E"));

I used ColorDialog in my project. ColorDialog sometimess return "Red","Fhushia" and sometimes return "fff000". I solved this problem like this maybe help someone.

        SolidBrush guideLineColor;
        if (inputColor.Any(c => char.IsDigit(c)))
        {
            string colorcode = inputColor;
            int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
             guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));

        }
        else
        {
            Color col = Color.FromName(inputColor);
             guideLineColor = new SolidBrush(col);
        }

InputColor is the return value from ColorDialog.

Thanks everyone for answer this question.It's big help to me.

There are many answers here already.

In short I support those that propose to use System.Drawing.ColorTranslator.

I get that some people want to avoid System.Windows.Media so there is the other solution, and since you want to have a System.Drawing.Color you should have a reference to System.Drawing already in your project.

So in short: Use the Framework if you can.

A more complete native solution

So, if for some reason you want to avoid System.Drawing.ColorTranslator and create your own implementation, you should at least make it respect the specifications

So this is a solution that does #RGB and #RGBA shorthand - and extended color definition

    public static Color ParseHtmlColor(string htmlColor) => Color.FromArgb(HtmlColorToArgb(htmlColor));

    public static int HtmlColorToArgb(string htmlColor, bool requireHexSpecified = false, int defaultAlpha = 0xFF)
    {

        if (string.IsNullOrEmpty(htmlColor))
        {
            throw new ArgumentNullException(nameof(htmlColor));
        }

        if (!htmlColor.StartsWith("#") && requireHexSpecified)
        {
            throw new ArgumentException($"Provided parameter '{htmlColor}' is not valid");
        }

        htmlColor = htmlColor.TrimStart('#');
        

        // int[] symbols 
        var symbolCount = htmlColor.Length;
        var value = int.Parse(htmlColor, System.Globalization.NumberStyles.HexNumber);
        switch (symbolCount)
        {
            case 3: // RGB short hand
            {
                return defaultAlpha << 24
                    | (value & 0xF)
                    | (value & 0xF) << 4
                    | (value & 0xF0) << 4
                    | (value & 0xF0) << 8
                    | (value & 0xF00) << 8
                    | (value & 0xF00) << 12
                    ;
            }
            case 4: // RGBA short hand
            {
                // Inline alpha swap
                return   (value & 0xF) << 24
                       | (value & 0xF) << 28
                       | (value & 0xF0) >> 4
                       | (value & 0xF0) 
                       | (value & 0xF00) 
                       | (value & 0xF00) << 4
                       | (value & 0xF000) << 4
                       | (value & 0xF000) << 8
                       ;
            }
            case 6: // RGB complete definition
            {
                return defaultAlpha << 24 | value;   
            }
            case 8: // RGBA complete definition
            {
                // Alpha swap
                return (value & 0xFF) << 24 | (value >> 8);
            }
            default:
                throw new FormatException("Invalid HTML Color");
        }
    }

If you for some reason don't want to use System.Globalization I'm sure you'll find a code snipped for parsing hex symbols.

Tests

    public static void TestColors()
    {
        foreach (var testCase in TestCases) TestColor(testCase);
    }

    static string[] TestCases = new string[] { 
        "111",
        "FFF", 
        "17A",
        "F52",
        "444F",
        "2348",
        "4320",
        "121212",
        "808080",
        "FFFFFF",
        "A0E0C0",
        "0A070B",
        "FFFFFFFF",
        "808080FF",
        "40807710"
    };

    public static void TestColor(string htmlColor)
    {
        Console.Write($" {htmlColor} -> ");
        var color = ParseHtmlColor(htmlColor);
        Console.WriteLine("0x" + color.ToArgb().ToString("X"));
    }

P.S.: Feel free to remove the paramters, they only intend to show how you could tweak the function to handle format errors and defaults.

P.P.S.: The error messages are not very descriptive at the moment

For any Xamarin developers out there, you will need to

  1. Specify the color type in order to prevent Cast exception from assuming you are talking about Xamarin.Forms.Color instead
  2. Create an object of type ColorConverter
var conv = new System.Drawing.ColorConverter();
var color = (System.Drawing.Color)conv.ConvertFromString("#FF1D65AE");
  • XNA / Monogame (Microsoft.Xna.Framework.Color).
  • Works for 6 or 8 (with alpha) character hexadecimal strings
  • Probably better alternatives (bit masking/shifting) out there.
    using Microsoft.Xna.Framework;
    using System.Globalization;
    
    public static class ColorBuilder
    {
        public static Color FromHex(string color)
        {
            var hex = color.Replace("#", string.Empty);
            var h = NumberStyles.HexNumber;

            var r = int.Parse(hex.Substring(0, 2), h);
            var g = int.Parse(hex.Substring(2, 2), h);
            var b = int.Parse(hex.Substring(4, 2), h);
            var a = 255;

            if (hex.Length == 8)
            {
                a = int.Parse(hex.Substring(6, 2), h);
            }
 
            return new Color(r, g, b, a);
        }
    }
    
    //create a blue color
    var color = ColorBuilder.FromHex("#2733C5"); //or ColorBuilder.FromHex("2733C5");
    
    //create a blue color with 50% alpha
    var colorTrans = ColorBuilder.FromHex("#2733C580");

If you mean HashCode as in .GetHashCode(), I'm afraid you can't go back. Hash functions are not bi-directional, you can go 'forward' only, not back.

Follow Oded's suggestion if you need to get the color based on the hexadecimal value of the color.

Related