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

595

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

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

Viky
источник
3
Может быть, под хеш-кодом они подразумевают # 00ff00?
Марк Байерс
12
Viky - не относятся к , что в качестве хэш - кода. Это сбивает с толку. ;-) Это шестнадцатеричное представление цвета.
Вим Холлебрандс
10
#FF0000является HTML (или шестнадцатеричным) цветным кодом, а не хеш-кодом. Пожалуйста, узнайте разницу.
Утром
10
Во многих странах символ # называется хешем, поэтому возникает путаница.
GeoffM
4
@axeman ??? Возможно, вы неправильно поняли, что делает GetHashCode () в C #. GetHashCode () - это метод для каждого объекта в .NET. Он не возвращает шестнадцатеричное значение из класса Color.
Джон

Ответы:

736

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

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Торарин
источник
@Thorarin любая помощь о том, как получить альфа-значение, так как мне нужно преобразовать это значение, чтобы быть совместимым с CSS RGBA для веб-дизайна.
Сиддхарт Пандей
2
@Yoda Первые две цифры (FF) являются альфа-значением. Вероятно, Color.FromArgbв этом случае использовать метод проще . Если вы используете альфа с плавающей запятой, вам придется умножить на 255.
Thorarin
2
если у вас есть значения RGB -> Color.FromArgb (255,192,0)
Iman
50
string hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml (hex);
Харшал Доши Джайн
1
почему бы не использовать color.FromArgb () вместо этого?
Нимиц Э.
549

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

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

Ханс Кеинг
источник
3
Color.FromArgb требует параметры a, r, g и b, а не целое число.
гражданин Конн
7
Это также полезно, если вы используете Compact Framework, в котором ColorTranslator недоступен
TechyGypo
7
@ user1763532 - После colorcode = colorcode.Replace("#", "")простого использования int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);и так далее для r, g и b. Не забудьте заменить первый параметр Substring - индекс - на 2 для r, 4 для g и 6 для b.
М. Мимпен
3
@HansKesting, FromArgbпринимает 1 параметр в System.Drawing.Colorи 4 параметра вSystem.Windows.Media.Color
torvin
2
Обратите внимание, что это работает для 4-байтового (например, #FFFFFFFF) цвета HTML (включая альфа). Если вы попробуете с 3 байтами (#FFFFFF), альфа будет 0 и ваш цвет прозрачен. Вы можете легко вставить альфу, если цветовой код меньше 8/9 символов. Отлично подходит для Compact Framework.
Апк
40

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

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();
увертываться
источник
6
Может быть, глупый вопрос, и немного поздно, но почему вы используете -16777216 для альфа-значения?
GeekPeek
3
Небольшое отклонение последовательно с использованием hex: вернуть Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (байт) (argb & 0xff));
тоже
1
Этот код неисправен. Я не мог понять, почему ничего не показывалось, и оказалось, что этот код не конвертирует hex Colorдолжным образом. Я использовал код из @too, и это исправило его.
ub3rst4r
Вот предыдущая версия этого ответа в следующем: http://stackoverflow.com/a/784852/2721611
Мойтаба Резаян
1
Вы можете просто & 0xFFиспользовать окончательное значение пониженного смещения каждый раз, вместо того, чтобы использовать все эти различные значения &.
Nyerguds
39

Три варианта ниже дают точно такой же цвет. Последнее имеет то преимущество, что оно выделяется в 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);
DEMP
источник
7
Ни одно из этих возвращений System.Windows.Media.Color.
Синатр
14
    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));
    }
Baddack
источник
2
В UWP Color.FromArgb () требуется 4 байтовых аргумента. Так это будет выглядеть так: вернуть Color.FromArgb (255, byte.Parse (hex.Substring (0, 2), System.Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (2, 2), System. Globalization.NumberStyles.HexNumber), byte.Parse (hex.Substring (4, 2), System.Globalization.NumberStyles.HexNumber));
Кибернетик
13

Мне нужно было преобразовать цветовой код 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));
ConfusedDeer
источник
11

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

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");
Pengzhi
источник
5

Если вы хотите сделать это с помощью Магазина 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));
Youngjae
источник
4

Этот пост стал тем, кто пытается преобразовать шестнадцатеричный цветовой код в системный цвет. Поэтому я решил добавить комплексное решение, которое работает с шестнадцатеричными (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)");

    }

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

Джастин
источник
0

WPF:

using System.Windows.Media;

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

//color to hex
string hexcolor = color.ToString();
DevXP
источник
На самом деле, нет гекса, ноColor [Indigo]
Джордж Ланец
0

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

System.Drawing.Color.FromArgb(myHashCode);
herzmeister
источник
2
Взгляд на преобразование шестнадцатеричной строки в int?
Торарин
Первоначально вопрос был задан как «Как получить цвет из хеш-кода», что вызвало здесь много путаницы. ;-)
Герцмейстер
0

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

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

Вим Холлебрандсе
источник
@Wim Спасибо за помощь в прояснении вопроса. Я бы сказал, что этот ответ больше не нужен, и рекомендую удалить его.
jpaugh
0

Я использовал 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.

Спасибо всем за ответ на этот вопрос. Это большая помощь для меня.

Cevdet
источник