2009-06-11 10 views
14

Según el título de la pregunta, ¿Cómo podría tomar un código hexadecimal y convertirlo en un objeto .Net Color, y hacerlo de otra forma?Convertir Objetos de Color .Net a códigos HEXOS y Atrás

Busqué en Google y sigo obteniendo el mismo método que no funciona.

ColorTranslator.ToHtml(renderedChart.ForeColor) 

Que devuelve el nombre del color como en 'Blanco' en lugar de '#ffffff'! Hacerlo de otra manera parece tener resultados raros, solo trabajando algunas veces ...

Respuesta

25

Algo así como:

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

Hacerlo de la otra forma es un poco más complejo como # F00 es un color HTML válido (es decir, llena de color rojo), pero todavía es factible el uso de expresiones regulares, aquí hay una pequeña clase de muestra:

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

Uso:

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

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

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

Esto parece excesivo teniendo en cuenta el hecho de que el método que utiliza el OP ya hace lo que necesitan. –

+1

No, necesito los códigos HEX independientemente de si es un Color HTML válido. Entonces necesito el maleficio para blanco y no 'blanco'. – Damien

+0

Es por eso que no he publicado un analizador completo, ya que no sé exactamente lo que requiere el OP ... parece que se niega a usar nombres de colores por alguna razón extraña ...Y ninguna API que conozco lo hace "Conversión de color como HTML, pero sin usar nombres de color estándar" –

12

"Blanco" es un color HTML válido. Por favor, vea ColorTranslator.ToHtml:

Este método se traduce un estructura de color a una representación de cadena de un de color HTML. Este es comúnmente el nombre utilizado de un color, como "Rojo", "Azul" o "Verde", y no cadena representación de un valor de color numérico , como "FF33AA".

Si su color no puede asignarse a una cadena de color HTML, este método devolverá el hex válido para el color. Vea este ejemplo:

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

Esta es la respuesta correcta y debe tener más votos. – maguy

-3
+1

'ToArgb()' devuelve un 'int', no una cadena hexadecimal. Intentar convertir un 'int' en una cadena hexadecimal causará el truncamiento. Por ejemplo, Green terminaría como '" FF00 "' en lugar de '" 00FF00 "'. Muchos navegadores interpretarían esto como una abreviatura de '" FFFF0000 "', lo que daría como resultado Red. – JDB

1

Si va a convertir el color de vuelta con ColorTranslator.FromHTML {}, 'White' es una cadena válida para un color HTML. Pero descubrí que esta implementación necesita un símbolo # antes de la cadena que representa el color si no es común (por ejemplo, funciona con Blanco y #FFFFFF, pero no con #White o FFFFFF). Así que traté de poner la conversión dentro de un bloque try/catch, hice la conversión agregando '#' a la cadena y si arrojó una excepción, la atrapé e hice la conversión sin #.

1

He escrito mi propia extensión .NET Para sencilla la conversión de hexadecimal a un entero y entero (ARGB) a color y 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 
Cuestiones relacionadas