2009-06-11 8 views
14

Selon le titre de la question, comment puis-je prendre un code hexadécimal et le convertir en objet .Net Color, et le faire dans l'autre sens?Convertir les objets couleur .Net en codes HEX et Retour

Je googlé et continue à obtenir le même chemin qui ne fonctionne pas.

ColorTranslator.ToHtml(renderedChart.ForeColor) 

qui renvoie le nom de la couleur comme dans « White » au lieu de « #ffffff »! Le faire dans l'autre sens semble avoir des résultats bizarres, ne fonctionnant que de temps en temps ...

Répondre

25

Quelque chose comme:

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

il Faire l'autre est un peu plus complexe que # F00 est une couleur HTML valide (ce qui signifie plein rouge), mais il est encore faisable en utilisant regex, voici une classe petit échantillon:

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

Utilisation:

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

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

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

Cela semble exagéré compte tenu du fait que la méthode que l'OP utilise déjà fait ce qu'ils ont besoin de faire. –

+1

Il n'a pas, j'ai besoin des codes HEX indépendamment de si est une couleur HTML valide. J'ai donc besoin de l'Hex pour White et non de 'White'. – Damien

+0

C'est pourquoi je n'ai pas posté un analyseur complet, car je ne sais pas ce qui est exactement requis par l'OP ... il semble refuser d'utiliser des noms de couleurs pour une raison étrange ...Et aucune API que je connais ne fait "Conversion de couleur comme le HTML le fait mais sans jamais utiliser des noms de couleurs standard" –

12

"Blanc" est une couleur HTML valide. S'il vous plaît voir ColorTranslator.ToHtml:

Cette méthode se traduit par une structure couleur à une représentation de chaîne d'une couleur HTML. C'est le nom couramment utilisé d'une couleur, comme "Rouge", "Bleu", ou "Vert", et non la chaîne la représentation d'une couleur numérique valeur, comme "FF33AA".

Si votre couleur ne peut pas être mappée à une chaîne de couleur HTML, cette méthode renvoie l'hex valide pour la couleur. Voir cet exemple:

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

Ceci est la bonne réponse et devrait avoir plus de voix. – maguy

-3
+1

'ToArgb()' renvoie un 'int', pas une chaîne hexadécimale. Tenter de convertir un 'int' en une chaîne hexadécimale entraînera une troncature. Par exemple, Green finirait par "FF00" plutôt que "00FF00" '. De nombreux navigateurs interpréteraient cela comme un raccourci pour '' "FFFF0000" ', ce qui donnerait Red. – JDB

1

Si vous convertir la couleur en arrière avec {ColorTranslator.FromHTML}, 'White' est une chaîne valide pour une couleur HTML. Mais j'ai trouvé que cette implémentation a besoin d'un symbole # devant la chaîne qui représente la couleur si elle n'est pas commune (par exemple, cela fonctionne avec White, et #FFFFFF, mais pas aveC#White ou FFFFFF). J'ai donc essayé de placer la conversion dans un bloc try/catch, j'ai fait la conversion en ajoutant '#' à la chaîne et si elle a jeté une exception, je l'ai attrapée et j'ai fait la conversion sans #.

1

J'ai écrit ma propre extension .net pour la conversion simple, de hexadécimal en entier et entier (ARGB) à la couleur et vice versa:

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