Come posso ottenere il colore da un codice colore esadecimale usando .NET?


595

Come posso ottenere un colore da un codice colore esadecimale (ad es. #FFDFD991)?

Sto leggendo un file e ricevo un codice colore esadecimale. Devo creare l' System.Windows.Media.Coloristanza corrispondente per il codice colore esadecimale. Esiste un metodo integrato nel framework per farlo?


3
Per codice hash forse significano # 00ff00?
Mark Byers,

12
Viky - non fare riferimento a questo come codice hash. È confusionario. ;-) È la rappresentazione esadecimale di un colore.
Wim Hollebrandse,

10
#FF0000è un codice colore HTML (o esadecimale), non un codice hash. Per favore, impara la differenza.
SLaks

10
Il simbolo # è chiamato hash in molti paesi, da cui la confusione.
GeoffM,

4
@axeman ??? Potresti aver frainteso ciò che fa GetHashCode () in C #. GetHashCode () è un metodo su ogni oggetto in .NET. Non restituisce un valore esadecimale dalla classe Color.
Giovanni,

Risposte:


736

Suppongo che sia un codice ARGB ... Ti riferisci a System.Drawing.Coloro System.Windows.Media.Color? Quest'ultimo è usato ad esempio in WPF. Non ho ancora visto nessuno menzionarlo, quindi nel caso lo stessi cercando:

using System.Windows.Media;

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

@Thorarin qualsiasi aiuto su come ottenere valore alfa in quanto ho bisogno di convertire questo valore per essere compatibile con css rgba per il web design.
Siddharth Pandey,

2
@Yoda Le prime due cifre (FF) sono il valore alfa. In Color.FromArgbquesto caso è probabilmente più facile usare il metodo. Se usi l'alfa in virgola mobile, dovresti moltiplicare per 255.
Thorarin,

2
nel caso abbiate i valori RGB -> Color.FromArgb (255.192,0)
Iman

50
string hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain,

1
perché non usare color.FromArgb () invece?
Nimitz E.

549

Supponendo di intendere i codici RGB di tipo HTML (chiamati codici esadecimali, come # FFCC66), utilizzare la classe ColorTranslator :

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

Se, tuttavia, stai utilizzando un codice esadecimale ARGB, puoi utilizzare la classe ColorConverter dallo spazio dei nomi System.Windows.Media:

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

116

Se non si desidera utilizzare ColorTranslator, è possibile farlo facilmente:

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

Il colorcode è solo la rappresentazione esadecimale del valore ARGB.

MODIFICARE

Se è necessario utilizzare 4 valori anziché un singolo intero, è possibile utilizzare questo (combinando diversi commenti):

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

Nota 1 : NumberStyles è in System.Globalization.
Nota 2 : si prega di fornire il proprio controllo degli errori (il codice colore deve essere un valore esadecimale di 6 o 8 caratteri)


3
Color.FromArgb richiede i parametri a, r, g e b, non un numero intero.
conn conn

7
Ciò è utile anche se si utilizza Compact Framework in cui ColorTranslator non è disponibile
TechyGypo

7
@ user1763532 - Dopo averlo colorcode = colorcode.Replace("#", "")usato semplicemente int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);e così via per r, g e b. Non dimenticare di sostituire il primo parametro di Sottostringa - l'indice - con 2 per r, 4 per ge 6 per b.
M. Mimpen,

3
@HansKesting, FromArgbaccetta 1 parametro in System.Drawing.Colore 4 parametri inSystem.Windows.Media.Color
torvin

2
Nota che funziona per un colore HTML a 4 byte (es. #FFFFFFFF) (inc alpha). Se provi con un 3 byte (#FFFFFF) l'alfa sarà 0 e il tuo colore trasparente. Puoi facilmente inserire alpha se il codice colore è inferiore a 8/9 caratteri. Ottimo per Compact Framework.
apc

40

C'è anche questo piccolo metodo di estensione pulito:

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

In uso:

Color color = 0xFFDFD991.ToColor();

6
Forse una domanda stupida, e un po 'in ritardo, ma perché usi -16777216 per il valore alfa?
GeekPeek,

3
Piccola variazione in modo coerente usando hex: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (byte) (argb & 0xff));
anche il

1
Questo codice è difettoso. Non sono riuscito a capire perché non venisse visualizzato nulla e si è scoperto perché questo codice non converte esadecimale in Colormodo corretto. Ho usato il codice di @too e questo è stato risolto.
ub3rst4r

Ecco una versione precedente con questa risposta: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian

1
Puoi semplicemente fare & 0xFFsul valore finale spostato ogni volta, invece di aver bisogno di tutti quei valori diversi con &esso.
Nyerguds,

39

Le tre varianti seguenti danno esattamente lo stesso colore. L'ultimo ha il vantaggio di essere evidenziato nell'IDE di Visual Studio 2010 (forse è ReSharper che lo sta facendo) con il colore giusto.

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

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

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

7
Nessuno di questi ritorni System.Windows.Media.Color.
Sinatr,

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
In UWP Color.FromArgb () richiede argomenti a 4 byte. Quindi sarà simile: return 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));
Kibernetik,

13

Avevo bisogno di convertire un codice colore HEX in System.Drawing.Color, in particolare una sfumatura di Alice Blue come sfondo su un modulo WPF e ho trovato che ci voleva più tempo del previsto per trovare la risposta:

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

È possibile utilizzare il seguente codice:

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

5

Se vuoi farlo con un'app di Windows Store, segui la risposta di @Hans Kesting e @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

Questo post è diventato il goto per chiunque cerchi di convertire da un codice colore esadecimale a un colore di sistema. Pertanto, ho pensato di aggiungere una soluzione completa che si occupa di valori esadecimali sia a 6 cifre (RGB) che a 8 cifre (ARGB).

Per impostazione predefinita, secondo Microsoft, durante la conversione da un valore RGB a un valore ARGB

Il valore alfa è implicitamente 255 (completamente opaco).

Ciò significa che aggiungendo FF a un codice colore esadecimale a 6 cifre (RGB) diventa un codice colore esadecimale ARGB a 8 cifre. Pertanto, è possibile creare un metodo semplice che gestisca sia esadecimali ARGB che RGB e li converta nella struttura del colore appropriata.

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

    }

Questo è stato ispirato dalla risposta di Hans Kesting.



0

WPF:

using System.Windows.Media;

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

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

In realtà, non c'è esagono, maColor [Indigo]
George Lanetz,

0

Uso

System.Drawing.Color.FromArgb(myHashCode);

2
Dà un'occhiata alla conversione da stringa esadecimale a int?
Thorarin,

Inizialmente la domanda era "Come ottenere un colore da un codice hash" che creava molta confusione qui. ;-)
Herzmeister,

0

Se intendi HashCode come in .GetHashCode(), temo che non puoi tornare indietro. Le funzioni hash non sono bidirezionali, puoi solo andare avanti, non indietro.

Segui il suggerimento di Oded se devi ottenere il colore in base al valore esadecimale del colore.


@Wim Grazie per aiutare l'OP a chiarire la domanda. Direi che questa risposta non è più necessaria e consiglierei di eliminarla.
jpaugh

0

Ho usato ColorDialog nel mio progetto. ColorDialog a volte restituisce "Rosso", "Fhushia" e talvolta restituisce "fff000". Ho risolto questo problema in questo modo, forse aiutare qualcuno.

        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 è il valore restituito da ColorDialog.

Grazie a tutti per aver risposto a questa domanda. Mi è di grande aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.