¿Cómo obtengo el color de un código de color hexadecimal usando .NET?

595

¿Cómo puedo obtener un color de un código de color hexadecimal (por ejemplo #FFDFD991)?

Estoy leyendo un archivo y obtengo un código de color hexadecimal. Necesito crear la System.Windows.Media.Colorinstancia correspondiente para el código de color hexadecimal. ¿Hay un método incorporado en el marco para hacer esto?

viky
fuente
3
¿Por código hash tal vez significan # 00ff00?
Mark Byers
12
Viky: no te refieras a eso como código hash. Es confuso. ;-) Es la representación hexadecimal de un color.
Wim Hollebrandse
10
#FF0000es un código de color HTML (o hexadecimal), no un código hash. Por favor, aprende la diferencia.
SLaks
10
El símbolo # se llama hash en muchos países, de ahí la confusión.
GeoffM
44
@axeman ??? Es posible que haya entendido mal lo que hace GetHashCode () en C #. GetHashCode () es un método en cada objeto en .NET. No devuelve un valor hexadecimal de la clase Color.
John

Respuestas:

736

Supongo que es un código ARGB ... ¿Te refieres a System.Drawing.Coloro System.Windows.Media.Color? Este último se usa en WPF, por ejemplo. Todavía no he visto a nadie mencionarlo, así que en caso de que lo estuvieras buscando:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Thorarin
fuente
@Thorarin cualquier ayuda sobre cómo obtener el valor alfa ya que necesito convertir este valor para que sea compatible con css rgba para diseño web.
Siddharth Pandey
2
@Yoda Los primeros dos dígitos (FF) son el valor alfa. Sin Color.FromArgbembargo , probablemente sea más fácil usar el método en este caso. Si usa alfa de coma flotante, tendría que multiplicar por 255.
Thorarin
2
en caso de que tenga los valores RGB -> Color.FromArgb (255,192,0)
Iman
50
string hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain
1
¿por qué no usar color.FromArgb () en su lugar?
Nimitz E.
549

Suponiendo que se refiere a los códigos RGB de tipo HTML (llamados códigos hexadecimales, como # FFCC66), use la clase ColorTranslator :

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

Sin embargo, si está utilizando un código hexadecimal ARGB, puede usar la clase ColorConverter del espacio de nombres System.Windows.Media:

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

Si no desea utilizar ColorTranslator, puede hacerlo fácilmente:

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

El código de color es solo la representación hexadecimal del valor ARGB.

EDITAR

Si necesita usar 4 valores en lugar de un solo entero, puede usar esto (combinando varios comentarios):

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 está en System.Globalization.
Nota 2 : proporcione su propia comprobación de errores (el código de color debe ser un valor hexadecimal de 6 u 8 caracteres)

Hans Kein
fuente
3
Color.FromArgb requiere parámetros a, r, g y b, no un número entero.
ciudadano conn
77
Esto también es útil si está utilizando el Marco Compacto en el que ColorTranslator no está disponible
TechyGypo
77
@ user1763532 - Después de colorcode = colorcode.Replace("#", "")simplemente usar int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);y así sucesivamente para r, g, y b. No olvide reemplazar el primer parámetro de Subcadena, el índice, con 2 para r, 4 para gy 6 para b.
M. Mimpen
3
@HansKesting, FromArgbtoma 1 parámetro System.Drawing.Colory 4 parámetros enSystem.Windows.Media.Color
torvin
2
Tenga en cuenta que esto funciona para un color HTML de 4 bytes (por ejemplo, #FFFFFFFF) (inc alfa). Si lo intentas con un alfa de 3 bytes (#FFFFFF) será 0 y tu color será transparente. Puede insertar alfa fácilmente si el código de color es inferior a 8/9 caracteres. Ideal para Compact Framework.
apc
40

También existe este pequeño método de extensión:

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

En uso:

Color color = 0xFFDFD991.ToColor();
Dar un bandazo
fuente
66
Tal vez una pregunta estúpida y un poco tarde, pero ¿por qué usa -16777216 para el valor alfa?
GeekPeek
3
Pequeña variación consistente usando hexadecimal: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (byte) (argb y 0xff));
también el
1
Este código es defectuoso No pude entender por qué no aparecía nada y resultó ser porque este código no convierte hexadecimal a Colorcorrectamente. Usé el código de @too y eso lo solucionó.
ub3rst4r
Aquí hay una versión anterior de esta respuesta: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian
1
Puede hacerlo & 0xFFcon el valor final reducido cada vez, en lugar de necesitar todos esos valores diferentes &.
Nyerguds
39

Las tres variantes a continuación dan exactamente el mismo color. El último tiene el beneficio de ser destacado en el IDE de Visual Studio 2010 (tal vez sea ReSharper quien lo está haciendo) con el color adecuado.

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

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

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);
demp
fuente
77
Ninguno de estos retornos 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
fuente
2
En UWP Color.FromArgb () requiere argumentos de 4 bytes. Por lo tanto, se verá así: 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

Necesitaba convertir un código de color HEX en un System.Drawing.Color, específicamente un tono de Alice Blue como fondo en un formulario WPF y descubrí que tardó más de lo esperado en encontrar la respuesta:

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));
Ciervo confundido
fuente
11

Puedes usar el siguiente código:

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

Si desea hacerlo con una aplicación de la Tienda Windows, siga las respuestas de @Hans Kesting y @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
fuente
4

Esta publicación se ha convertido en el goto para cualquiera que intente convertir un código de color hexadecimal a un color del sistema. Por lo tanto, pensé que agregaría una solución integral que trate con valores hexadecimales de 6 dígitos (RGB) y 8 dígitos (ARGB).

De manera predeterminada, según Microsoft, al convertir de un valor RGB a ARGB

El valor alfa es implícitamente 255 (totalmente opaco).

Esto significa que al agregar FF a un código de color hexadecimal de 6 dígitos (RGB) se convierte en un código de color hexadecimal ARGB de 8 dígitos. Por lo tanto, se puede crear un método simple que maneje los hexágonos ARGB y RGB y los convierta en la estructura de color adecuada.

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

    }

Esto fue inspirado por la respuesta de Hans Kesting.

Justin
fuente
0

WPF:

using System.Windows.Media;

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

//color to hex
string hexcolor = color.ToString();
DevXP
fuente
En realidad, no hay maleficio peroColor [Indigo]
George Lanetz
0

Utilizar

System.Drawing.Color.FromArgb(myHashCode);
herzmeister
fuente
2
Mira sobre la conversión de cadena hexadecimal a int?
Thorarin
Originalmente, la pregunta se hacía como "Cómo obtener un color de un código hash", lo que creó mucha confusión aquí. ;-)
herzmeister
0

Si te refieres a HashCode como en .GetHashCode(), me temo que no puedes volver. Las funciones de hash no son bidireccionales, solo puede avanzar, no retroceder.

Siga la sugerencia de Oded si necesita obtener el color según el valor hexadecimal del color.

Wim Hollebrandse
fuente
@Wim Gracias por ayudar al OP a aclarar la pregunta. Diría que esta respuesta ya no es necesaria, y recomiendo eliminarla.
jpaugh
0

Usé ColorDialog en mi proyecto. ColorDialog alguna vez devuelve "Rojo", "Fhushia" y algunas veces devuelve "fff000". Resolví este problema así, tal vez ayudar a alguien.

        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 es el valor de retorno de ColorDialog.

Gracias a todos por responder esta pregunta. Es de gran ayuda para mí.

Cevdet
fuente