Wie erhalte ich die Farbe aus einem hexadezimalen Farbcode mit .NET?

595

Wie kann ich eine Farbe aus einem hexadezimalen Farbcode erhalten (z. B. #FFDFD991)?

Ich lese eine Datei und erhalte einen hexadezimalen Farbcode. Ich muss die entsprechende System.Windows.Media.ColorInstanz für den hexadezimalen Farbcode erstellen. Gibt es eine eingebaute Methode im Framework, um dies zu tun?

viky
quelle
3
Mit Hash-Code meinen sie vielleicht # 00ff00?
Mark Byers
12
Viky - beziehen sich nicht auf das als Hash - Code. Es ist verwirrend. ;-) Es ist die hexadezimale Darstellung einer Farbe.
Wim Hollebrandse
10
#FF0000ist ein HTML-Farbcode (oder hexadezimaler Farbcode), kein Hashcode. Bitte lernen Sie den Unterschied.
SLaks
10
Das Symbol # wird in vielen Ländern als Hash bezeichnet, daher die Verwirrung.
GeoffM
4
@axeman ??? Möglicherweise haben Sie falsch verstanden, was GetHashCode () in C # tut. GetHashCode () ist eine Methode für jedes Objekt in .NET. Es wird kein hexadezimaler Wert aus der Color-Klasse zurückgegeben.
John

Antworten:

736

Ich gehe davon aus, dass dies ein ARGB-Code ist ... Beziehen Sie sich auf System.Drawing.Coloroder System.Windows.Media.Color? Letzteres wird beispielsweise in WPF verwendet. Ich habe noch niemanden gesehen, der es erwähnt hat, also nur für den Fall, dass Sie danach suchen:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Thorarin
quelle
@Thorarin jede Hilfe, wie man Alpha-Wert erhält, da ich diesen Wert konvertieren muss, um mit CSS RGBA für Webdesign kompatibel zu sein.
Siddharth Pandey
2
@Yoda Die ersten beiden Ziffern (FF) sind der Alpha-Wert. Color.FromArgbIn diesem Fall ist es wahrscheinlich einfacher, die Methode zu verwenden . Wenn Sie Gleitkomma-Alpha verwenden, müssen Sie mit 255 multiplizieren.
Thorarin
2
falls Sie die RGB-Werte haben -> Color.FromArgb (255,192,0)
Iman
50
string hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain
1
Warum nicht stattdessen color.FromArgb () verwenden?
Nimitz E.
549

Angenommen, Sie meinen die RGB-Codes vom HTML-Typ (Hex-Codes genannt, wie z. B. # FFCC66), verwenden Sie die ColorTranslator- Klasse:

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

Wenn Sie jedoch einen ARGB-Hex-Code verwenden, können Sie die ColorConverter- Klasse aus dem System.Windows.Media-Namespace verwenden:

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

Wenn Sie den ColorTranslator nicht verwenden möchten, können Sie dies ganz einfach tun:

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

Der Farbcode ist nur die hexadezimale Darstellung des ARGB-Werts.

BEARBEITEN

Wenn Sie 4 Werte anstelle einer einzelnen Ganzzahl verwenden müssen, können Sie dies verwenden (mehrere Kommentare kombinieren):

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

Hinweis 1 : NumberStyles befindet sich in System.Globalization.
Hinweis 2 : Bitte geben Sie Ihre eigene Fehlerprüfung an (der Farbcode sollte ein Hexadezimalwert von 6 oder 8 Zeichen sein).

Hans Keing
quelle
3
Color.FromArgb erfordert die Parameter a, r, g und b, keine Ganzzahl.
Bürger Conn
7
Dies ist auch nützlich, wenn Sie das Compact Framework verwenden, in dem ColorTranslator nicht verfügbar ist
TechyGypo
7
@ user1763532 - Nach colorcode = colorcode.Replace("#", "")einfachem Gebrauch int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);und so weiter für r, g und b. Vergessen Sie nicht, den ersten Parameter von Teilstring - den Index - durch 2 für r, 4 für g und 6 für b zu ersetzen.
M. Mimpen
3
@ HansKesting, FromArgbnimmt 1 Parameter in System.Drawing.Colorund 4 Parameter inSystem.Windows.Media.Color
Torvin
2
Beachten Sie, dass dies für eine 4-Byte-HTML-Farbe (z. B. #FFFFFFFF) (inkl. Alpha) funktioniert. Wenn Sie es mit einem 3-Byte-Alpha (#FFFFFF) versuchen, ist es 0 und Ihre Farbe transparent. Sie können ganz einfach Alpha einfügen, wenn der Farbcode weniger als 8/9 Zeichen beträgt. Ideal für Compact Framework.
APC
40

Es gibt auch diese nette kleine Erweiterungsmethode:

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 Benutzung:

Color color = 0xFFDFD991.ToColor();
Jink
quelle
6
Vielleicht eine dumme Frage und etwas spät, aber warum verwenden Sie -16777216 für den Alpha-Wert?
GeekPeek
3
Kleine Abweichung konsistent mit hex: return Color.FromArgb ((Byte) ((argb & 0xff000000) >> 0x18), (Byte) ((argb & 0xff0000) >> 0x10), (Byte) ((argb & 0xff00) >> 0x08), (Byte) (argb & 0xff));
Auch
1
Dieser Code ist fehlerhaft. Ich konnte nicht herausfinden, warum nichts angezeigt wurde, und es stellte sich heraus, dass dieser Code Hex nicht Colorrichtig konvertiert . Ich habe den Code von @too verwendet und das hat ihn behoben.
ub3rst4r
Hier gibt es eine frühere Version dieser Antwort in: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian
1
Sie können einfach & 0xFFjedes Mal den endgültigen heruntergeschalteten Wert verwenden, anstatt all diese unterschiedlichen Werte zu benötigen &.
Nyerguds
39

Die drei folgenden Varianten ergeben genau die gleiche Farbe. Der letzte hat den Vorteil, dass er in der Visual Studio 2010-IDE (möglicherweise ist es ReSharper, der dies tut) mit der richtigen Farbe hervorgehoben wird.

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

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

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);
demp
quelle
7
Keine dieser Rückgaben 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
quelle
2
In UWP erfordert Color.FromArgb () 4-Byte-Argumente. Es sieht also so aus: 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

Ich musste einen HEX-Farbcode in einen System.Drawing.Color konvertieren, insbesondere einen Farbton von Alice Blue als Hintergrund in einem WPF-Formular, und stellte fest, dass es länger dauerte als erwartet, um die Antwort zu finden:

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
quelle
11

Sie können den folgenden Code verwenden:

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

Wenn Sie dies mit einer Windows Store-App tun möchten, folgen Sie den Antworten von @Hans Kesting und @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
quelle
4

Dieser Beitrag ist zu einem Muss für alle geworden, die versuchen, von einem Hex-Farbcode in eine Systemfarbe zu konvertieren. Daher dachte ich, ich würde eine umfassende Lösung hinzufügen, die sowohl 6-stellige (RGB) als auch 8-stellige (ARGB) Hex-Werte behandelt.

Laut Microsoft beim Konvertieren von einem RGB- in einen ARGB-Wert standardmäßig

Der Alpha-Wert beträgt implizit 255 (vollständig undurchsichtig).

Dies bedeutet, dass durch Hinzufügen von FF zu einem 6-stelligen (RGB) Hex-Farbcode ein 8-stelliger ARGB-Hex-Farbcode wird. Daher kann eine einfache Methode erstellt werden, die sowohl ARGB- als auch RGB-Hex-Zeichen verarbeitet und in die entsprechende Farbstruktur konvertiert.

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

    }

Dies wurde von Hans Kestings Antwort inspiriert.

Justin
quelle
0

WPF:

using System.Windows.Media;

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

//color to hex
string hexcolor = color.ToString();
DevXP
quelle
Eigentlich gibt es kein Hex aberColor [Indigo]
George Lanetz
0

Verwenden

System.Drawing.Color.FromArgb(myHashCode);
herzmeister
quelle
2
Blick über die Konvertierung von Hex-String zu int?
Thorarin
Ursprünglich wurde die Frage "Wie man eine Farbe aus einem Hash-Code erhält" gestellt, was hier viel Verwirrung stiftete. ;-)
Herzmeister
0

Wenn Sie HashCode wie in meinen, können Sie leider .GetHashCode()nicht zurück. Hash-Funktionen sind nicht bidirektional, Sie können nur vorwärts und nicht rückwärts gehen.

Befolgen Sie den Vorschlag von Oded, wenn Sie die Farbe basierend auf dem hexadezimalen Wert der Farbe erhalten möchten.

Wim Hollebrandse
quelle
@Wim Danke, dass du dem OP geholfen hast, die Frage zu klären. Ich würde sagen, dass diese Antwort nicht mehr benötigt wird, und empfehle, sie zu löschen.
Jpaugh
0

Ich habe ColorDialog in meinem Projekt verwendet. ColorDialog gibt manchmal "Red", "Fhushia" und manchmal "fff000" zurück. Ich habe dieses Problem so gelöst, vielleicht jemandem helfen.

        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 ist der Rückgabewert von ColorDialog.

Vielen Dank an alle für die Beantwortung dieser Frage. Es ist eine große Hilfe für mich.

Cevdet
quelle