Як отримати колір із шістнадцяткового коду кольорів за допомогою .NET?


593

Як я можу отримати колір із шістнадцяткового коду кольорів (наприклад #FFDFD991)?

Я читаю файл і отримую шістнадцятковий колірний код. Мені потрібно створити відповідний System.Windows.Media.Colorекземпляр для шістнадцяткового кодового кольору. Чи є вбудований метод в рамках для цього?


3
Під хеш-кодом вони можуть означати # 00ff00?
Марк Байєрс

12
Вікі - не посилайтеся на це як хеш-код. Це заплутано. ;-) Це шістнадцяткове зображення кольору.
Вім Холлебрандсе

10
#FF0000це HTML (або шістнадцятковий) колірний код, а не хеш-код. Будь ласка, дізнайтеся різницю.
СЛАкс

10
Символ # у багатьох країнах називають хеш, звідси плутанина.
GeoffM

4
@axeman ??? Можливо, ви неправильно зрозуміли, що робить GetHashCode () у C #. GetHashCode () - метод на кожному об'єкті в .NET. Це не повертає шістнадцяткове значення з класу Color.
Джон

Відповіді:


735

Я припускаю, що це код 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.
Торарін

2
якщо у вас є значення RGB -> Color.FromArgb (255,192,0)
Іман

50
string hex = "#FFFFFF"; Колір _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.

EDIT

Якщо вам потрібно використовувати 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
Це також корисно, якщо ви використовуєте компактний каркас, у якому 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
торвін

2
Зверніть увагу, це працює для 4-байтового (наприклад, #FFFFFFFF) HTML-кольору (вкл. Альфа). Якщо ви спробуєте з 3-байтною (#FFFFFF) альфа буде 0, а ваш колір прозорим. Ви можете легко вставити альфа, якщо код кольору менше 8/9 символів. Відмінно підходить для компактних рамок.
apc

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: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (байт) (argb & 0xff));
теж

1
Цей код несправний. Я не міг зрозуміти, чому нічого не відображається, і виявилося, що цей код не перетворює шістнадцяткову форму в Colorналежну. Я використав код від @too і це виправив.
ub3rst4r

Ось попередня версія на цю відповідь так: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian

1
Ви можете & 0xFFщоразу робити остаточне зменшене значення, замість того, щоб знадобитися всі ці різні значення для &нього.
Nyerguds

39

Три варіанти нижче надають абсолютно однаковий колір. Остання має перевагу, що вона виділяється в 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);

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

2
У UWP Color.FromArgb () потрібно 4 байт-аргументи. Так буде виглядати: повернути Color.FromArgb (255, байт.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));

11

Ви можете використовувати такий код:

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

5

Якщо ви хочете зробити це за допомогою програми 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));

4

Ця публікація стала гото для всіх, хто намагається перетворити з шестигранного коду кольору в системний колір. Тому я подумав би додати комплексне рішення, яке стосується шестизначних значень (RGB) та 8 знаків (ARGB).

За замовчуванням, за даними Microsoft, при перетворенні з RGB у значення ARGB

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

Це означає, що додавши FF до шестизначного (RGB) шестигранного кодового коду, він стає шістнадцятковим кольоровим кодом ARGB. Тому може бути створений простий метод, який обробляє і шестигранники ARGB, і RGB і перетворює їх у відповідну структуру кольорів.

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

Насправді, немає шестигранника, алеColor [Indigo]
Джордж Ланець

0

Використовуйте

System.Drawing.Color.FromArgb(myHashCode);

2
Погляди на перетворення з шістнадцяткових рядків у int?
Торарін

Спочатку питання було задано як "Як отримати колір з хеш-коду", що створило багато плутанини тут. ;-)
herzmeister

0

Якщо ви маєте на увазі HashCode як в .GetHashCode(), я боюся, що ви не можете повернутися. Функції хешу не є двонаправленими, ви можете йти лише "вперед", а не назад.

Дотримуйтесь пропозиції Одеда, якщо вам потрібно отримати колір на основі шістнадцяткового значення кольору.


@ Вдячний спасибі за допомогу ОП у з'ясуванні питання. Я б сказав, що ця відповідь більше не потрібна, і рекомендую її видалити.
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.

Дякую всім за відповідь на це питання. Це мені велика допомога.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.