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




tabla de colores html pdf (10)

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

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


Esta publicación se ha convertido en el goto para cualquiera que intente convertir un código de color hexadecimal a un color de 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 forma 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 hexes ARGB y RGB y los convierta a 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.


Las tres variantes siguientes dan exactamente el mismo color. El último tiene la ventaja de estar resaltado en el IDE de Visual Studio 2010 (quizás sea ReSharper lo que 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);

Podrías usar el siguiente código:

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


Si no desea utilizar el traductor de color, 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)


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 basado en el valor hexadecimal del color.


Suponiendo que te refieres a los códigos RGB de tipo HTML (llamados códigos hexadecimales, como # FFCC66), usa la clase ColorTranslator :

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

Si, sin embargo, 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") ;

También existe este método de extensión poco ordenado:

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

WPF:

using System.Windows.Media;

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

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

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




hex