2009-06-11 47 views
14

根據問題標題,我如何獲取十六進制代碼並將其轉換爲.Net顏色對象,並以相反方式進行操作?將.Net顏色對象轉換爲十六進制代碼並返回

我GOOGLE了,並繼續得到相同的方式,這是行不通的。

ColorTranslator.ToHtml(renderedChart.ForeColor) 

它返回顏色的名稱,如'White'而不是'#ffffff'!以另一種方式做它似乎有奇怪的結果,只有一些時間工作...

回答

25

喜歡的東西:

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

做它的另一種方法是有點複雜,因爲#F00是一個有效的HTML顏色(指全紅),但它使用仍然是可行的正則表達式,這裏是一個小樣本類:

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

用法:

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

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

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

考慮到OP所使用的方法已經做到了他們需要做的事情,這看起來似乎過度殺傷了。 – 2009-06-11 16:27:15

+1

它不,我需要十六進制代碼,不管是否是有效的HTML顏色。所以我需要Hex for White而不是'White'。 – Damien 2009-06-11 16:30:18

12

「白色」有效的HTML顏色。請參閱ColorTranslator.ToHtml

這種方法把一個顏色 結構的HTML顏色的字符串表示 。這是通常使用的顏色名稱,如「紅色」, 「藍色」或「綠色」,而不是字符串 數值顏色 值的表示,如「FF33AA」。

如果您的顏色無法映射到HTML顏色字符串,則此方法將返回該顏色的有效十六進制。看到這個例子:

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

這是正確的答案,應該有更多的選票。 – maguy 2016-10-23 23:48:44

1

如果將轉換顏色回來{} ColorTranslator.FromHTML '白' 是一個HTML顏色的有效字符串。但是我發現這個實現在代表顏色的字符串之前需要一個#符號,如果它不常見(例如,它適用於White和#FFFFFF,但它不適用於#White或FFFFFF)。 所以我試圖把轉換放在一個try/catch塊中,使轉換爲字符串添加'#',如果它拋出一個異常,那麼我抓住它並且做了沒有#的轉換。

1

我寫我自己的.NET擴展從十六進制整數和整數(ARGB)簡單轉換成顏色,反之亦然:

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 
相關問題