如何在.NET中使用十六进制颜色代码获取颜色?

701

如何从十六进制颜色代码(例如#FFDFD991)获取颜色?

我正在读取一个文件,并获得一个十六进制颜色代码。我需要创建相应的 System.Windows.Media.Color 实例来表示该十六进制颜色代码。在框架中是否有内置方法可以实现这一点?


字符串 hex = "#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml(hex); - Harshal Doshi Jain
我知道这是关于WPF的问题,但如果有人正在使用Xamarin,那么Color类中有一个方法:Color.FromHex("#FFDFD991") - benscabbia
@benscabbia WinForms和NET6都有这个类,但是没有这个方法。 - user1853517
20个回答

832

我假设你指的是ARGB代码... 你是指 System.Drawing.Color 还是 System.Windows.Media.Color?后者例如在WPF中使用。我还没有看到任何人提到它,所以以防万一,如果你正在寻找它:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");

4
前两个数字(FF)代表透明度值。在这种情况下,使用Color.FromArgb方法可能更容易。如果使用浮点数透明度,需要乘以255。 - Thorarin
2
如果您有RGB值 -> Color.FromArgb(255,192,0) - Iman
74
字符串 hex = "#FFFFFF"; 颜色 _color = System.Drawing.ColorTranslator.FromHtml(hex); - Harshal Doshi Jain
2
为什么不使用color.FromArgb()呢? - Nimitz E.
运作正常,但在使用ConvertFromString方法之前需要创建一个ColorConverter实例。 - ZooZ
显示剩余2条评论

621
假设你指的是HTML类型的RGB代码(称为十六进制代码,例如#FFCC66),请使用ColorTranslator类:
System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");

如果你使用的是ARGB十六进制代码,你可以使用System.Windows.Media命名空间中的ColorConverter类:

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

142

如果您不想使用ColorTranslator,也可以轻松地完成:

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

颜色代码只是ARGB值的十六进制表示。

编辑

如果需要使用4个值而不是单个整数,可以使用以下方法(结合几条评论):

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

注意1:NumberStyles位于System.Globalization命名空间中。
注意2:请提供您自己的错误检查(colorcode应该是6或8个字符的十六进制值)。


3
Color.FromArgb 需要传入 a、r、g 和 b 四个参数,而不是一个整数。 - citizen conn
7
如果您在使用紧凑框架(Compact Framework)且无法使用ColorTranslator时,这也很有用。 - TechyGypo
7
在执行colorcode = colorcode.Replace("#", "")后,直接使用int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);进行转换,对于r、g和b也是同样的操作。不要忘记将 Substring 的第一个参数 - 索引 - 分别替换为2(对于r),4(对于g)和6(对于b)。 - M. Mimpen
4
@HansKesting,“FromArgb”在“System.Drawing.Color”中只接受1个参数,在“System.Windows.Media.Color”中接受4个参数。 - torvin
2
请注意,此代码适用于4字节(例如#FFFFFFFF)的HTML颜色(包括alpha通道)。如果您尝试使用3字节(#FFFFFF),则alpha通道将为0,颜色将变为透明。如果颜色代码少于8/9个字符,则可以轻松插入alpha通道。非常适合紧凑框架。 - apc
显示剩余4条评论

44

以下三个变体的颜色完全相同。最后一个的好处是在 Visual Studio 2010 IDE 中可以以正确的颜色进行突出显示(可能是 ReSharper 在起作用)。

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

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

var cc3 = System.Drawing.Color.FromArgb(0x47, 0x9D, 0xEE);

8
这些都不返回 System.Windows.Media.Color - Sinatr

41

还有这个简洁的扩展方法:

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

使用中:

Color color = 0xFFDFD991.ToColor();

7
也许这是一个愚蠢的问题,而且有点晚了,但是为什么你要使用-16777216来表示 Alpha 值? - GeekPeek
5
使用十六进制对颜色值进行小变化:返回Color对象,其ARGB分别为((argb & 0xff000000) >> 0x18),((argb & 0xff0000) >> 0x10),((argb & 0xff00) >> 0x08),(argb & 0xff)。 - too
1
这段代码有问题。我一开始不知道为什么没有显示任何内容,后来发现是因为这段代码无法正确地将十六进制转换为“Color”。我使用了@too的代码,问题得到了解决。 - SameOldNick
1
每次只需对最终降位后的值执行& 0xFF操作,而无需使用所有这些不同的值来进行&运算。 - Nyerguds
1
Color.FromArgb 没有一个简单接受 Int32 的重载吗?我的意思是,System.Drawing.Color 有这个功能。 - Nyerguds
显示剩余2条评论

17

我需要将一个十六进制颜色代码转换为System.Drawing.Color,具体来说是Alice Blue的一种背景颜色用于WPF表单上,并发现寻找答案比预期花费了更长的时间:

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

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

2
在UWP中,Color.FromArgb()需要4个字节的参数。因此它看起来像这样: 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

12
您可以使用以下代码:

您可以使用以下代码:

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

6

如果您想使用Windows Store应用程序进行操作,请参考@Hans Kesting和@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));

5

在ASP.NET中:

color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");

ColorConverter 可在 System.DrawingSystem.Windows.Media 中使用。您指的是哪一个(两者都与 ASP.NET 无关)? - Klaus Gütter
1
System.Drawing 中的 ColorConverter 可以在 ASP.NET 中使用。 - Khalil Youssefi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,