Como obtenho a cor de um código de cor hexadecimal usando o .NET?

595

Como posso obter uma cor de um código de cores hexadecimal (por exemplo #FFDFD991)?

Estou lendo um arquivo e obtendo um código de cores hexadecimal. Preciso criar a System.Windows.Media.Colorinstância correspondente para o código de cores hexadecimal. Existe um método embutido na estrutura para fazer isso?

viky
fonte
3
Por código hash, talvez eles signifiquem # 00ff00?
precisa
12
Viky - não se refira a isso como código hash. É confuso. ;-) É a representação hexadecimal de uma cor.
Wim Hollebrandse
10
#FF0000é um código de cores HTML (ou hexadecimal), não um código de hash. Por favor, aprenda a diferença.
SLaks
10
O símbolo # é chamado de hash em muitos países, daí a confusão.
GeoffM 2/12/12
4
@axeman ??? Você pode ter entendido mal o que GetHashCode () em C # faz. GetHashCode () é um método em todos os objetos no .NET. Ele não retorna um valor hexadecimal da classe Color.
John

Respostas:

736

Suponho que seja um código ARGB ... Você está se referindo a System.Drawing.Colorou System.Windows.Media.Color? O último é usado no WPF, por exemplo. Eu não vi ninguém mencionar ainda, então, caso você esteja procurando:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Thorarin
fonte
@ Torarin qualquer ajuda sobre como obter o valor alfa, pois preciso converter esse valor para ser compatível com css rgba para web design.
amigos estão dizendo sobre
2
@Yoda Os dois primeiros dígitos (FF) são o valor alfa. Provavelmente é mais fácil usar o Color.FromArgbmétodo nesse caso. Se você usar alfa ponto flutuante, você teria que multiplicar por 255.
Thorarin
2
caso você possua os valores RGB -> Color.FromArgb (255,192,0)
Iman
50
string hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml (hex);
Harshal Doshi Jain 29/11
1
por que não usar color.FromArgb ()?
Nimitz E.
549

Supondo que você queira dizer os códigos RGB do tipo HTML (chamados códigos Hex, como # FFCC66), use a classe ColorTranslator :

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

Se, no entanto, você estiver usando um código hexadecimal ARGB, poderá usar a classe ColorConverter no espaço para nome System.Windows.Media:

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

Se você não quiser usar o ColorTranslator, poderá fazê-lo facilmente:

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

O código de cor é apenas a representação hexadecimal do valor ARGB.

EDITAR

Se você precisar usar 4 valores em vez de um único número inteiro, poderá usá-lo (combinando vários comentários):

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á em System.Globalization.
Nota 2 : forneça sua própria verificação de erro (o código de cor deve ser um valor hexadecimal de 6 ou 8 caracteres)

Hans Keing
fonte
3
Color.FromArgb requer parâmetros a, r, ge eb, não um número inteiro.
cidadão conn
7
Isso também é útil se você estiver usando o Compact Framework em que ColorTranslator não está disponível
TechyGypo
7
@ user1763532 - Depois de colorcode = colorcode.Replace("#", "")simplesmente usar int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);e assim por diante para r, g e b. Não se esqueça de substituir o primeiro parâmetro da Substring - o índice - por 2 para r, 4 para ge 6 para b.
M. Mimpen
3
@HansKesting, FromArgbleva 1 parâmetro no System.Drawing.Colore 4 paramteres emSystem.Windows.Media.Color
torvin
2
Observe que isso funciona para uma cor HTML de 4 bytes (por exemplo, #FFFFFFFF) (incluindo alfa). Se você tentar com um byte de 3 bytes (#FFFFFF), o alfa será 0 e sua cor transparente. Você pode facilmente inserir alfa se o código de cores for menor que 8/9 caracteres. Ótimo para o Compact Framework.
apc
40

Há também este pequeno método de extensão simples:

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

Em uso:

Color color = 0xFFDFD991.ToColor();
Jink
fonte
6
Talvez seja uma pergunta estúpida e um pouco tarde, mas por que você usa -16777216 para o valor alfa?
21412 GeekPeek
3
Pequena variação consistentemente usando hex: return Color.FromArgb ((byte) ((argb & 0xff000000) >> 0x18), (byte) ((argb & 0xff0000) >> 0x10), (byte) ((argb & 0xff00) >> 0x08), (byte) (argb & 0xff));
também
1
Este código está com defeito. Eu não conseguia descobrir por que nada estava aparecendo e acabou sendo porque esse código não converte hexadecimal para Colorcorretamente. Eu usei o código do @too e o corrigi.
Ub3rst4r
Aqui há uma versão anterior desta resposta no modo: http://stackoverflow.com/a/784852/2721611
Mojtaba Rezaeian
1
Você pode simplesmente fazer & 0xFFo valor do downshifted final a cada vez, em vez de precisar de todos esses valores diferentes &.
Nyerguds
39

As três variantes abaixo dão exatamente a mesma cor. O último tem o benefício de ser destacado no IDE do Visual Studio 2010 (talvez seja o ReSharper que esteja fazendo isso) com a cor adequada.

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

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

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);
demp
fonte
7
Nenhum desses 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
fonte
2
No UWP, Color.FromArgb () requer argumentos de 4 bytes. Assim, parecerá: 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

Eu precisava converter um código de cores HEX em um System.Drawing.Color, especificamente um tom de Alice Blue como plano de fundo em um formulário WPF e achei que demorou mais tempo do que o esperado para encontrar a resposta:

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

Você pode usar o seguinte código:

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

Se você quiser fazer isso com um aplicativo da Windows Store, siga @Hans Kesting e a resposta @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
fonte
4

Esta postagem tornou-se o caminho para quem tenta converter um código de cores hexadecimal para uma cor do sistema. Portanto, pensei em adicionar uma solução abrangente que lida com valores hexadecimais de 6 dígitos (RGB) e 8 dígitos (ARGB).

Por padrão, de acordo com a Microsoft, ao converter de um valor RGB para ARGB

O valor alfa é implicitamente 255 (totalmente opaco).

Isso significa que, adicionando FF a um código de cores hexadecimal de 6 dígitos (RGB), ele se torna um código de cor hexadecimal ARGB de 8 dígitos. Portanto, é possível criar um método simples que lide com hexadecimais ARGB e RGB e os converta na estrutura Color apropriada.

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

    }

Isso foi inspirado na resposta de Hans Kesting.

Justin
fonte
0

WPF:

using System.Windows.Media;

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

//color to hex
string hexcolor = color.ToString();
DevXP
fonte
Na verdade, não há Color [Indigo]
azar
0

Usar

System.Drawing.Color.FromArgb(myHashCode);
herzmeister
fonte
2
Observa a conversão da string hexadecimal para int?
Thorarin
Originalmente, a pergunta era feita como "Como obter uma cor de um código hash", o que criou muita confusão aqui. ;-)
herzmeister
0

Se você quer dizer o HashCode como em .GetHashCode(), acho que você não pode voltar. As funções de hash não são bidirecionais, você pode avançar apenas, não voltar.

Siga a sugestão de Oded se precisar obter a cor com base no valor hexadecimal da cor.

Wim Hollebrandse
fonte
@ Wim Obrigado por ajudar o OP a esclarecer a questão. Eu diria que essa resposta não é mais necessária e recomendo excluí-la.
jpaugh
0

Eu usei o ColorDialog no meu projeto. Às vezes, o ColorDialog retorna "Red", "Fhushia" e às vezes retorna "fff000". Eu resolvi esse problema assim talvez ajude alguém.

        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 é o valor de retorno do ColorDialog.

Obrigado a todos por responder a esta pergunta. É uma grande ajuda para mim.

Cevdet
fonte