Как получить цвет из шестнадцатеричного цветового кода с помощью .NET?

Как я могу получить цвет из шестнадцатеричного цветового кода (например, #FFDFD991)?

Я читаю файл и получаю шестнадцатеричный код цвета. Мне нужно создать соответствующий экземпляр System.Windows.Media.Color для шестнадцатеричного кода цвета. Есть ли встроенный метод в этой структуре?

Ответ 1

Я предполагаю, что код ARGB... Вы имеете в виду System.Drawing.Color или System.Windows.Media.Color? Последнее используется, например, в WPF. Я еще не видел, чтобы кто-нибудь упоминал об этом, поэтому на всякий случай вы его искали:

using System.Windows.Media;

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

Ответ 2

Предполагая, что вы имеете в виду коды типа RGB HTML (называемые шестнадцатеричными кодами, такие как # FFCC66), используйте класс ColorTranslator:

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

Если, однако, вы используете шестнадцатеричный код ARGB, вы можете использовать класс ColorConverter из пространства имен System.Windows.Media:

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

Ответ 3

Если вы не хотите использовать ColorTranslator, вы можете сделать это легко:

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

Цветовой код - это всего лишь шестнадцатеричное представление значения ARGB.

РЕДАКТИРОВАТЬ

Если вам нужно использовать 4 значения вместо одного целого числа, вы можете использовать это (объединение нескольких комментариев):

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));

Примечание 1: NumberStyles находится в System.Globalization.
Примечание 2: укажите свою собственную проверку ошибок (цветной код должен быть шестнадцатеричным значением 6 или 8 символов)

Ответ 4

Существует также этот аккуратный метод расширения:

static class ExtensionMethods
{
    public static Color ToColor(this uint argb)
    {
        return Color.FromArgb((byte)((argb & -16777216)>> 0x18),      
                              (byte)((argb & 0xff0000)>> 0x10),   
                              (byte)((argb & 0xff00) >> 8),
                              (byte)(argb & 0xff));
    }
}

При использовании:

Color color = 0xFFDFD991.ToColor();

Ответ 5

Три варианта ниже дают точно такой же цвет. Последний из них имеет преимущество в том, чтобы выделяться в Visual Studio 2010 IDE (возможно, это ReSharper, который делает это) с правильным цветом.

var cc1 = System.Drawing.ColorTranslator.FromHtml("#479DEE");

var cc2 = System.Drawing.Color.FromArgb(0x479DEE);

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);

Ответ 6

    private Color FromHex(string hex)
    {
        if (hex.StartsWith("#"))
            hex = hex.Substring(1);

        if (hex.Length != 6) throw new Exception("Color not valid");

        return Color.FromArgb(
            int.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
            int.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
            int.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber));
    }

Ответ 7

Вы можете использовать следующий код:

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");

Ответ 8

Мне нужно было преобразовать оттенок Алисы Синего в качестве фона в форме WPF и обнаружил, что для ответа требуется больше времени:

using System.Windows.Media;

-

System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("#EFF3F7");
this.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(myColor.A, myColor.R, myColor.G, myColor.B));

Ответ 9

Если вы хотите сделать это с помощью приложения для Windows Store, следуйте @Hans Kesting и @Jink:

    string colorcode = "#FFEEDDCC";
    int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
    tData.DefaultData = Color.FromArgb((byte)((argb & -16777216) >> 0x18),
                          (byte)((argb & 0xff0000) >> 0x10),
                          (byte)((argb & 0xff00) >> 8),
                          (byte)(argb & 0xff));

Ответ 10

Это сообщение стало goto для тех, кто пытается конвертировать из шестнадцатеричного цветового кода в системный цвет. Поэтому я подумал, что добавлю комплексное решение, которое касается шестнадцатеричных (RGB) и 8-значных (ARGB) шестнадцатеричных значений.

По умолчанию, согласно Microsoft, при преобразовании из значения RGB в ARGB

Значение альфа неявно 255 (полностью непрозрачное).

Это означает, что добавив FF к шестизначному (RGB) шестнадцатеричному цветному коду, он станет восьмизначным кодом цвета ARGB hex. Таким образом, может быть создан простой метод, который обрабатывает как ARGB, так и RGB hex и преобразует их в соответствующую структуру Color.

    public static System.Drawing.Color GetColorFromHexValue(string hex)
    {
        string cleanHex = hex.Replace("0x", "").TrimStart('#');

        if (cleanHex.Length == 6)
        {
            //Affix fully opaque alpha hex value of FF (225)
            cleanHex = "FF" + cleanHex;
        }

        int argb;

        if (Int32.TryParse(cleanHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out argb))
        {
            return System.Drawing.Color.FromArgb(argb);
        }

        //If method hasn't returned a color yet, then there a problem
        throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");

    }

Это было вдохновлено ответом Ганса Кестинга.

Ответ 11

использование

System.Drawing.Color.FromArgb(myHashCode);

Ответ 13

Если вы имеете в виду HashCode, как в .GetHashCode(), я боюсь, что вы не можете вернуться. Хеш-функции не являются двунаправленными, вы можете идти только вперед, а не назад.

Следуйте указаниям Oded, если вам нужно получить цвет, основанный на шестнадцатеричном значении цвета.

Ответ 14

WPF:

using System.Windows.Media;

//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");

//color to hex
string hexcolor = color.ToString();