Jak uzyskać kolor z szesnastkowego kodu kolorów za pomocą .NET?


592

Jak mogę uzyskać kolor z szesnastkowego kodu kolorów (np. #FFDFD991)?

Czytam plik i otrzymuję szesnastkowy kod koloru. Muszę utworzyć odpowiednią System.Windows.Media.Colorinstancję dla kodu koloru szesnastkowego. Czy istnieje wbudowana metoda pozwalająca to zrobić?


3
Przez kod skrótu może oznaczać # 00ff00?
Mark Byers

12
Viky - nie nazywaj tego hashem. To jest mylące. ;-) To szesnastkowa reprezentacja koloru.
Wim Hollebrandse

10
#FF0000to kod koloru HTML (lub szesnastkowy), a nie kod skrótu. Naucz się różnicy.
SLaks,

10
Symbol # nazywa się skrótem w wielu krajach, stąd zamieszanie.
GeoffM

4
@axeman ??? Być może źle zrozumiałeś, co robi GetHashCode () w C #. GetHashCode () to metoda na każdym obiekcie w .NET. Nie zwraca wartości szesnastkowej z klasy Color.
Jan

Odpowiedzi:


735

Zakładam, że to kod ARGB ... Masz na myśli System.Drawing.Colorczy System.Windows.Media.Color? Ten ostatni jest używany na przykład w WPF. Jeszcze nie widziałem, żeby ktoś o tym wspominał, więc na wypadek, gdybyś go szukał:

using System.Windows.Media;

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

@Thorarin wszelka pomoc, jak uzyskać wartość alfa, ponieważ muszę przekonwertować tę wartość, aby była zgodna z css rgba do projektowania stron internetowych.
Siddharth Pandey,

2
@Yoda Pierwsze dwie cyfry (FF) to wartość alfa. W Color.FromArgbtym przypadku prawdopodobnie łatwiej jest jednak użyć tej metody. Jeśli użyjesz zmiennoprzecinkowej alfa, będziesz musiał pomnożyć przez 255.
Thorarin

2
jeśli masz wartości RGB -> Color.FromArgb (255,192,0)
Iman

50
ciąg szesnastkowy = "#FFFFFF"; Kolor _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain

1
dlaczego nie użyć zamiast tego color.FromArgb ()?
Nimitz E.,

549

Zakładając, że masz na myśli kody RGB typu HTML (nazywane kodami Hex, takimi jak # FFCC66), użyj klasy ColorTranslator :

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

Jeśli jednak używasz kodu szesnastkowego ARGB, możesz użyć klasy ColorConverter z przestrzeni nazw System.Windows.Media:

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

115

Jeśli nie chcesz korzystać z ColorTranslator, możesz to zrobić w łatwy sposób:

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

Kod koloru to tylko szesnastkowa reprezentacja wartości ARGB.

EDYTOWAĆ

Jeśli chcesz użyć 4 wartości zamiast jednej liczby całkowitej, możesz użyć tego (łącząc kilka komentarzy):

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

Uwaga 1 : NumberStyles znajduje się w System.Globalization.
Uwaga 2 : podaj własne sprawdzanie błędów (kod koloru powinien być wartością szesnastkową o długości 6 lub 8 znaków)


3
Color.FromArgb wymaga parametrów a, r, g i b, a nie liczb całkowitych.
obywatel podłączono

7
Jest to również przydatne, jeśli korzystasz z Compact Framework, w którym ColorTranslator nie jest dostępny
TechyGypo

7
@ user1763532 - Po colorcode = colorcode.Replace("#", "")prostu użyj int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);i tak dalej dla r, g i b. Nie zapomnij zastąpić pierwszego parametru podłańcucha - indeksu - 2 dla r, 4 dla g i 6 dla b.
M. Mimpen,

3
@HansKesting, FromArgbprzyjmuje 1 parametr System.Drawing.Colori 4 parametry System.Windows.Media.Color
wejściowe

2
Uwaga: działa to w przypadku 4-bajtowego (np. #FFFFFFFF) koloru HTML (włącznie z alfą). Jeśli spróbujesz z 3-bajtową (#FFFFFF) wartością alfa będzie 0, a twój kolor będzie przezroczysty. Możesz łatwo wstawić alfa, jeśli kod koloru jest mniejszy niż 8/9 znaków. Idealne dla Compact Framework.
apc

40

Istnieje również ta zgrabna mała metoda rozszerzenia:

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

W użyciu:

Color color = 0xFFDFD991.ToColor();

6
Może głupie pytanie i trochę spóźnione, ale dlaczego używasz -16777216 dla wartości alfa?
GeekPeek

3
Mała odmiana konsekwentnie wykorzystująca hex: zwraca Color.FromArgb ((bajt) ((argb i 0xff000000) >> 0x18), (bajt) ((argb i 0xff0000) >> 0x10), (bajt) ((argb i 0xff00) >> 0x08), (bajt) (argb i 0xff));
zbyt

1
Ten kod jest wadliwy. Nie mogłem zrozumieć, dlaczego nic się nie pojawiło i okazało się, że ten kod nie konwertuje Colorpoprawnie szesnastkowego . Użyłem kodu z @too i to naprawiło.
ub3rst4r

Oto poprzednia wersja tej odpowiedzi: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian

1
Możesz po prostu zrobić & 0xFFza każdym razem końcową wartość obniżoną, zamiast potrzebować tych wszystkich różnych wartości &.
Nyerguds,

38

Trzy poniższe warianty dają dokładnie ten sam kolor. Ostatni ma tę zaletę, że jest podświetlony w programie Visual Studio 2010 IDE (może to robi ReSharper) w odpowiednim kolorze.

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

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

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

7
Żadne z tych zwrotów 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
W UWP Color.FromArgb () wymaga 4 bajtów argumentów. Będzie więc wyglądał następująco: 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

Musiałem przekonwertować kod koloru HEX na System.Drawing.Color, a konkretnie odcień Alice Blue jako tło w formularzu WPF i stwierdziłem, że znalezienie odpowiedzi zajęło więcej czasu niż oczekiwano:

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

Możesz użyć następującego kodu:

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

5

Jeśli chcesz to zrobić za pomocą aplikacji Windows Store, odpowiedz @Hans Kesting i @Jink odpowiedz:

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

3

Ten post stał się goto dla każdego, kto próbuje przekonwertować kod koloru szesnastkowego na kolor systemowy. Dlatego pomyślałem, że dodam kompleksowe rozwiązanie, które obsługuje zarówno wartości szesnastkowe (RGB), jak i 8-cyfrowe (ARGB).

Domyślnie, według Microsoft, przy konwersji z wartości RGB na ARGB

Wartość alfa wynosi domyślnie 255 (całkowicie nieprzezroczysta).

Oznacza to, że po dodaniu FF do 6-cyfrowego kodu szesnastkowego (RGB) staje się 8-cyfrowym kodem szesnastkowym ARGB. Dlatego można stworzyć prostą metodę, która obsługuje zarówno szesnastki ARGB, jak i RGB i konwertuje je na odpowiednią strukturę kolorów.

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

    }

Inspiracją była odpowiedź Hansa Kestinga.



0

WPF:

using System.Windows.Media;

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

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

Właściwie nie ma Color [Indigo]
heksa,

0

Posługiwać się

System.Drawing.Color.FromArgb(myHashCode);

2
Spojrzenia na konwersję z ciągu szesnastkowego na int?
Thorarin

Pierwotnie pytanie było zadawane jako „Jak uzyskać kolor z kodu skrótu”, co spowodowało wiele zamieszania. ;-)
herzmeister

0

Jeśli masz na myśli HashCode jak w .GetHashCode(), obawiam się, że nie możesz wrócić. Funkcje skrótu nie są dwukierunkowe, można przejść tylko do przodu, a nie wstecz.

Postępuj zgodnie z sugestią Odeda, jeśli chcesz uzyskać kolor na podstawie szesnastkowej wartości koloru.


@Wim Dzięki za pomoc OP w wyjaśnieniu pytania. Powiedziałbym, że ta odpowiedź nie jest już potrzebna i zalecam jej usunięcie.
jpaugh

0

Użyłem ColorDialog w moim projekcie. ColorDialog czasami zwraca „Red”, „Fhushia”, a czasami zwraca „fff000”. Rozwiązałem ten problem w ten sposób, może komuś pomóc.

        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 to zwracana wartość z ColorDialog.

Dziękuję wszystkim za odpowiedź na to pytanie. To dla mnie wielka pomoc.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.