Comment puis-je obtenir la couleur d'un code couleur hexadécimal en utilisant .NET?

595

Comment puis-je obtenir une couleur à partir d'un code couleur hexadécimal (par exemple #FFDFD991)?

Je lis un fichier et j'obtiens un code couleur hexadécimal. J'ai besoin de créer l' System.Windows.Media.Colorinstance correspondante pour le code couleur hexadécimal. Existe-t-il une méthode intégrée dans le cadre pour ce faire?

viky
la source
3
Par code de hachage, ils signifient peut-être # 00ff00?
Mark Byers
12
Viky - ne faites pas référence à cela comme un code de hachage. C'est confu. ;-) C'est la représentation hexadécimale d'une couleur.
Wim Hollebrandse
10
#FF0000est un code couleur HTML (ou hexadécimal), pas un code de hachage. Veuillez apprendre la différence.
SLaks
10
Le symbole # est appelé hachage dans de nombreux pays, d'où la confusion.
GeoffM
4
@axeman ??? Vous avez peut-être mal compris ce que fait GetHashCode () en C #. GetHashCode () est une méthode sur chaque objet dans .NET. Il ne renvoie pas de valeur hexadécimale à partir de la classe Color.
John

Réponses:

736

Je suppose que c'est un code ARGB ... Vous parlez de System.Drawing.Colorou System.Windows.Media.Color? Ce dernier est utilisé dans WPF par exemple. Je n'ai encore vu personne le mentionner, alors juste au cas où vous le recherchez:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Thorarin
la source
@Thorarin toute aide sur la façon d'obtenir la valeur alpha car j'ai besoin de convertir cette valeur pour être compatible avec css rgba pour la conception web.
Siddharth Pandey
2
@Yoda Les deux premiers chiffres (FF) sont la valeur alpha. Color.FromArgbCependant, il est probablement plus facile d'utiliser la méthode dans ce cas. Si vous utilisez l'alpha à virgule flottante, vous devrez multiplier par 255.
Thorarin
2
dans le cas où vous avez les valeurs RVB -> Color.FromArgb (255,192,0)
Iman
50
chaîne hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain
1
pourquoi ne pas utiliser color.FromArgb () à la place?
Nimitz E.
549

En supposant que vous voulez dire les codes RVB de type HTML (appelés codes Hex, tels que # FFCC66), utilisez la classe ColorTranslator :

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

Si, toutefois, vous utilisez un code hexadécimal ARGB, vous pouvez utiliser la classe ColorConverter de l'espace de noms System.Windows.Media:

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

Si vous ne souhaitez pas utiliser ColorTranslator, vous pouvez le faire facilement:

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

Le code couleur n'est que la représentation hexadécimale de la valeur ARGB.

ÉDITER

Si vous devez utiliser 4 valeurs au lieu d'un seul entier, vous pouvez utiliser ceci (en combinant plusieurs commentaires):

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

Remarque 1 : NumberStyles est dans System.Globalization.
Remarque 2 : veuillez fournir votre propre vérification d'erreur (le code couleur doit être une valeur hexadécimale de 6 ou 8 caractères)

Hans Ke st ing
la source
3
Color.FromArgb nécessite des paramètres a, r, g et b, pas un entier.
citoyen conn
7
Ceci est également utile si vous utilisez le Compact Framework dans lequel ColorTranslator n'est pas disponible
TechyGypo
7
@ user1763532 - Après avoir colorcode = colorcode.Replace("#", "")simplement utilisé int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);et ainsi de suite pour r, g et b. N'oubliez pas de remplacer le premier paramètre de Substring - l'index - par 2 pour r, 4 pour g et 6 pour b.
M. Mimpen
3
@HansKesting, FromArgbprend 1 paramètre System.Drawing.Coloret 4 paramètresSystem.Windows.Media.Color
torvin
2
Notez que cela fonctionne pour une couleur HTML de 4 octets (par exemple #FFFFFFFF) (inc alpha). Si vous essayez avec un alpha de 3 octets (#FFFFFF) sera 0 et votre couleur transparente. Vous pouvez facilement insérer de l'alpha si le code couleur est inférieur à 8/9 caractères. Idéal pour Compact Framework.
2018
40

Il y a aussi cette petite méthode d'extension soignée:

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

Utilisé:

Color color = 0xFFDFD991.ToColor();
Jink
la source
6
Peut-être une question stupide, et un peu tard, mais pourquoi utilisez-vous -16777216 pour la valeur alpha?
GeekPeek
3
Petite variation utilisant systématiquement hex: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (octet) (argb & 0xff));
trop
1
Ce code est défectueux. Je ne pouvais pas comprendre pourquoi rien ne se présentait et cela s'est avéré être parce que ce code ne convertit pas Colorcorrectement hex . J'ai utilisé le code de @too et cela l'a corrigé.
ub3rst4r
Voici une version précédente de cette réponse: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian
1
Vous pouvez simplement faire & 0xFFà chaque fois la valeur rétrogradée finale, au lieu d'avoir besoin de toutes ces différentes valeurs &.
Nyerguds
39

Les trois variantes ci-dessous donnent exactement la même couleur. Le dernier a l'avantage d'être mis en évidence dans l'IDE de Visual Studio 2010 (peut-être que c'est ReSharper qui le fait) avec la bonne couleur.

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

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

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);
demp
la source
7
Aucun de ces retours 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));
    }
Baddack
la source
2
Dans UWP, Color.FromArgb () requiert des arguments de 4 octets. Il ressemblera donc à: 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

J'avais besoin de convertir un code couleur HEX en System.Drawing.Color, en particulier une nuance d'Alice Blue en arrière-plan sur un formulaire WPF et j'ai trouvé qu'il fallait plus de temps que prévu pour trouver la réponse:

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
la source
11

Vous pouvez utiliser le code suivant:

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");
Pengzhi
la source
5

Si vous voulez le faire avec une application Windows Store, suivez @Hans Kesting et @Jink réponse:

    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
la source
4

Ce message est devenu le goto pour quiconque essaie de convertir un code de couleur hexadécimal en une couleur système. Par conséquent, j'ai pensé ajouter une solution complète qui prend en charge les valeurs hexadécimales à 6 chiffres (RVB) et 8 chiffres (ARGB).

Par défaut, selon Microsoft, lors de la conversion d'une valeur RVB en valeur ARGB

La valeur alpha est implicitement 255 (entièrement opaque).

Cela signifie qu'en ajoutant FF à un code de couleur hexadécimal à 6 chiffres (RVB), il devient un code de couleur hexadécimal ARGB à 8 chiffres. Par conséquent, une méthode simple peut être créée qui gère les hexagones ARGB et RGB et les convertit en la structure de couleur appropriée.

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

    }

Cela a été inspiré par la réponse de Hans Kesting.

Justin
la source
0

WPF:

using System.Windows.Media;

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

//color to hex
string hexcolor = color.ToString();
DevXP
la source
En fait, il n'y a pas d'hexagone maisColor [Indigo]
George Lanetz
0

Utilisation

System.Drawing.Color.FromArgb(myHashCode);
herzmeister
la source
2
Coup d'œil sur la conversion de la chaîne hexadécimale en int?
Thorarin
À l'origine, la question était "Comment obtenir une couleur à partir d'un code de hachage", ce qui a créé beaucoup de confusion ici. ;-)
herzmeister
0

Si vous voulez dire HashCode comme .GetHashCode(), je crains que vous ne puissiez pas revenir en arrière. Les fonctions de hachage ne sont pas bidirectionnelles, vous pouvez avancer uniquement, pas en arrière.

Suivez la suggestion d'Oded si vous avez besoin d'obtenir la couleur en fonction de la valeur hexadécimale de la couleur.

Wim Hollebrandse
la source
@Wim Merci d'avoir aidé le PO à clarifier la question. Je dirais que cette réponse n'est plus nécessaire et je recommande de la supprimer.
jpaugh
0

J'ai utilisé ColorDialog dans mon projet. ColorDialog retourne parfois "Red", "Fhushia" et retourne parfois "fff000". J'ai résolu ce problème comme ça peut-être aider quelqu'un.

        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 est la valeur de retour de ColorDialog.

Merci à tous d'avoir répondu à cette question, cela m'aide beaucoup.

Cevdet
la source