2009-06-11 6 views
14

Come per il titolo della domanda, Come posso prendere un codice esadecimale e convertirlo in un oggetto .Net Color, e farlo in un altro modo?Converti Oggetti .Net Color a codici HEX e Indietro

Ho cercato su google e continuo a ottenere lo stesso modo che non funziona.

ColorTranslator.ToHtml(renderedChart.ForeColor) 

Che restituisce il nome del colore come in "Bianco" anziché "#ffffff"! Farlo in un altro modo sembra avere risultati strani, solo lavorando un po 'di tempo ...

risposta

25

Qualcosa di simile:

Color color = Color.Red; 
string colorString = string.Format("#{0:X2}{1:X2}{2:X2}", 
    color.R, color.G, color.B); 

Farlo l'altro modo è un po 'più complesso come # F00 è un colore html valida (che significa rosso pieno), ma è ancora fattibile utilizzando regex, ecco un piccolo campione di classe:

using System; 
using System.Diagnostics; 
using System.Drawing; 
using System.Text.RegularExpressions; 
using System.Collections.Generic; 

public static class HtmlColors 
{ 
    public static string ToHtmlHexadecimal(this Color color) 
    { 
     return string.Format("#{0:X2}{1:X2}{2:X2}", color.R, color.G, color.B); 
    } 

    static Regex htmlColorRegex = new Regex(
     @"^#((?'R'[0-9a-f]{2})(?'G'[0-9a-f]{2})(?'B'[0-9a-f]{2}))" 
     + @"|((?'R'[0-9a-f])(?'G'[0-9a-f])(?'B'[0-9a-f]))$", 
     RegexOptions.Compiled | RegexOptions.IgnoreCase); 

    public static Color FromHtmlHexadecimal(string colorString) 
    { 
     if (colorString == null) 
     { 
      throw new ArgumentNullException("colorString"); 
     } 

     var match = htmlColorRegex.Match(colorString); 
     if (!match.Success) 
     { 
      var msg = "The string \"{0}\" doesn't represent" 
      msg += "a valid HTML hexadecimal color"; 
      msg = string.Format(msg, colorString); 

      throw new ArgumentException(msg, 
       "colorString"); 
     } 

     return Color.FromArgb(
      ColorComponentToValue(match.Groups["R"].Value), 
      ColorComponentToValue(match.Groups["G"].Value), 
      ColorComponentToValue(match.Groups["B"].Value)); 
    } 

    static int ColorComponentToValue(string component) 
    { 
     Debug.Assert(component != null); 
     Debug.Assert(component.Length > 0); 
     Debug.Assert(component.Length <= 2); 

     if (component.Length == 1) 
     { 
      component += component; 
     } 

     return int.Parse(component, 
      System.Globalization.NumberStyles.HexNumber); 
    } 
} 

Usage:

// Display #FF0000 
Console.WriteLine(Color.Red.ToHtmlHexadecimal()); 

// Display #00FF00 
Console.WriteLine(HtmlColors.FromHtmlHexadecimal("#0F0").ToHtmlHexadecimal()); 

// Display #FAF0FE 
Console.WriteLine(HtmlColors.FromHtmlHexadecimal("#FAF0FE").ToHtmlHexadecimal()); 
+0

Questo sembra eccessivo, considerando il fatto che il metodo utilizzato dall'OP fa già ciò di cui hanno bisogno. –

+1

Non è così, ho bisogno dei codici HEX a prescindere dal fatto che sia un colore HTML valido. Quindi ho bisogno di Hex for White e non di 'White'. – Damien

+0

Ecco perché non ho pubblicato un parser completo, in quanto non so cosa sia esattamente richiesto dall'OP ... sembra rifiutarsi di usare i nomi dei colori per qualche strana ragione ...E nessuna API che conosco fa "conversione colore come HTML ma senza usare mai nomi di colori standard" –

12

"Bianco" è un colore HTML valido. Si prega di consultare ColorTranslator.ToHtml:

Questo metodo traduce un struttura di colore per una rappresentazione di stringa di un colore HTML. Questo è comunemente il nome utilizzato di di un colore, come "Rosso", "Blu" o "Verde", e non la stringa rappresentazione di un valore numerico di colore , ad esempio "FF33AA".

Se il colore non può essere associato a una stringa di colori HTML, questo metodo restituirà l'esadecimale valido per il colore. Vedere questo esempio:

using System; 
using System.Drawing; 

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(ColorTranslator.ToHtml(Color.White)); 
     Console.WriteLine(ColorTranslator.ToHtml(Color.FromArgb(32,67,89))); 
    } 
} 
+0

Questa è la risposta corretta e dovrebbe avere più voti. – maguy

-3
+1

'ToArgb()' restituisce un 'int', non una stringa esadecimale. Il tentativo di convertire un 'int' in una stringa esadecimale causerà il troncamento. Ad esempio, Green risulterebbe come "FF00" anziché "00FF00". Molti browser interpreterebbero questo come una scorciatoia per "" FFFF0000 "', risultante in Rosso. – JDB

1

Se si convertire il colore posteriore con {} ColorTranslator.FromHTML, 'White' è una stringa valida per un colore HTML. Ma ho trovato che questa implementazione ha bisogno di un simbolo # prima della stringa che rappresenta il colore se non è comune (ad esempio, funziona con White e #FFFFFF, ma non con #White o FFFFFF). Così ho provato a inserire la conversione in un blocco try/catch, ho fatto la conversione aggiungendo '#' alla stringa e se ha lanciato un'eccezione, l'ho catturata e ho fatto la conversione senza #.

1

ho scritto la mia estensione .net per una semplice conversione da esadecimale a intero ed intero (ARGB) al colore e viceversa:

Imports System.Drawing 
Imports System.Runtime.CompilerServices 

Public Module ColorsExt 

    Private Sub example_for_usage() 
     Dim hex As String 
     Dim c As Color = Color.Red 
     hex = c.ToHexString() 'Converts color to hexadecimal string' 
     c = hex.ToIntegerFromHex().ToColor() 'Gets Integer value from the hex string and simply convert it to Color()' 
    End Sub 

    <Extension> _ 
    Public Function ToColor(ByVal argb As Integer) As Color 
     Return Color.FromArgb(argb) 
    End Function 

    <Extension> _ 
    Public Function ToIntegerFromHex(ByVal argb_hex_string As String) As Integer 
     Return Int("&H" + argb_hex_string) 
    End Function 

    <Extension> _ 
    Public Function ToHexString(ByVal c As Color) As String 
     Return String.Format("{0:X2}{1:X2}{2:X2}{3:X2}", c.A, c.R, c.G, c.B) 
    End Function 

    <Extension> _ 
    Public Sub FromHexString(ByVal c As Color, ByVal hex As String) 
     c = hex.ToIntegerFromHex().ToColor() 
    End Sub 

    <Extension> _ 
    Public Function ToHexString(ByVal c As Integer) As String 
     Return String.Format("{0:X8}", c) 
    End Function 

    <Extension> _ 
    Public Function ToArgb(ByVal c As Color) As Integer 
     Return (c.A * &HFF0000) + (c.R * &HFF00) + (c.G * &HFF) + (c.B) 
    End Function 

End Module