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

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

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

21 ответ

Решение

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

using System.Windows.Media;

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

Предполагая, что вы имеете в виду коды 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") ;

Если вы не хотите использовать 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 символов)

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

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

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

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

Есть также этот аккуратный метод расширения:

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

Мне нужно было преобразовать цветовой код HEX в System.Drawing.Color, в частности, оттенок Alice Blue в качестве фона в форме 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));
    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));
    }

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

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

В asp.net:

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

Если вы хотите сделать это с помощью Магазина Windows, следуйте инструкциям @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));

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

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

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

Это означает, что, добавляя FF к 6-значному (RGB) шестнадцатеричному цветному коду, он становится 8-значным шестнадцатеричным цветным кодом ARGB. Таким образом, можно создать простой метод, который обрабатывает как гексагоны ARGB, так и RGB и преобразует их в соответствующую структуру 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's a problem
        throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");

    }

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

Всем разработчикам Xamarin вам потребуется

  1. Укажите тип цвета, чтобы исключение Cast не предполагало, что вы говорите о Xamarin.Forms.Color вместо этого.
  2. Создайте объект типа ColorConverter
      var conv = new System.Drawing.ColorConverter();
var color = (System.Drawing.Color)conv.ConvertFromString("#FF1D65AE");

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

System.Drawing.Color.FromArgb(myHashCode);

Вы можете использовать метод ColorConverter.ConvertFromString(string), который преобразует вашу строку (шестнадцатеричную) в цвет.

Пример: (Это работает с ARGB, например "#FF1E1E1E".

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

Вы можете видеть, что Silverlight/WPF устанавливает эллипс с шестнадцатеричным цветом для использования шестнадцатеричного значения:

your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)
  • XNA/Моноигра (Microsoft.Xna.Framework.Color).
  • Работает для 6- или 8-символьных (с альфа-каналом) шестнадцатеричных строк.
  • Вероятно, есть лучшие альтернативы (маскировка/сдвиг битов).
          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");

WPF:

using System.Windows.Media;

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

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

Я использовал ColorDialog в своем проекте. ColorDialog иногда возвращает "Red","Fhushia" и иногда возвращает "fff000". Я решил эту проблему так, может быть, кому-то поможет.

        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 - это значение, возвращаемое ColorDialog.

Спасибо всем за ответ на этот вопрос. Это очень мне помогло.

Основное просто:

Color.ParseColor("#ff43a047")

Здесь уже есть много ответов.

Короче поддерживаю тех, которые предлагают использовать.

Я понимаю, что некоторые люди хотят избегать System.Windows.Media так что есть другое решение, и поскольку вы хотите иметь System.Drawing.Color у вас должна быть ссылка на System.Drawing уже в вашем проекте.

Вкратце: используйте Framework, если можете.

Более полное собственное решение

Итак, если по какой-то причине вы хотите избежать System.Drawing.ColorTranslatorи создайте свою собственную реализацию, вы должны хотя бы сделать так, чтобы она соответствовала спецификациям

Итак, это решение, которое #RGB а также #RGBA сокращение - и расширенное определение цвета

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

Если вы по какой-то причине не хотите использовать System.Globalization Я уверен, что вы найдете вырезанный код для разбора шестнадцатеричных символов.

Тесты

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

PS: Не стесняйтесь удалять параметры, они предназначены только для того, чтобы показать, как вы можете настроить функцию для обработки ошибок формата и значений по умолчанию.

PPS: сообщения об ошибках на данный момент не очень информативны

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

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

Другие вопросы по тегам