问答中心分类: WPF如何使用 .NET 从十六进制颜色代码中获取颜色?
0
匿名用户 提问 1月 前

如何从十六进制颜色代码中获取颜色(例如#FFDFD991)?
我正在阅读一个文件并获得一个十六进制颜色代码。我需要创建相应的System.Windows.Media.Color例如十六进制颜色代码。框架中是否有内置方法可以做到这一点?

Harshal Doshi Jain 回复 1月 前

字符串十六进制 = "#FFFFFF";颜色 _color = System.Drawing.ColorTranslator.FromHtml(hex);

Harshal Doshi Jain 回复 1月 前

我知道这是与 WPF 相关的问题,但如果有人使用 xamarin,那么 Color 类上有一个方法:Color.FromHex("#FFDFD991")

19 Answers
0
Oded 回答 1月 前

假设您指的是 HTML 类型的 RGB 代码(称为十六进制代码,例如 #FFCC66),请使用颜色转换器班级:

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");

但是,如果您使用的是 ARGB 十六进制代码,则可以使用颜色转换器System.Windows.Media 命名空间中的类:

Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;
0
Hans Kesting 回答 1月 前

如果你不想使用 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:请提供您自己的错误检查(颜色代码应为 6 或 8 个字符的十六进制值)

marshall.ward 回复 1月 前

对于那些使用 Visual C# Express 的人来说,这是一个很好的解决方案,因为它只需要System.Globalization.

Andrea Antonangeli 回复 1月 前

+1:非常好用。在 VB.NET 中使用它: clr = Color.FromArgb(Int32.Parse("FFFFFF00", Globalization.NumberStyles.HexNumber))

citizen conn 回复 1月 前

Color.FromArgb 需要 a、r、g 和 b 参数,而不是整数。

TechyGypo 回复 1月 前

如果您使用 ColorTranslator 不可用的 Compact Framework,这也很有用

Leon Storey 回复 1月 前

至少在 Windows Phone 上,Color.FromArgb 采用 4 字节参数,而不是 int。

M. Mimpen 回复 1月 前

@user1763532 – 之后colorcode = colorcode.Replace("#", "")只需使用int a = byte.parse(colorcode.Substring(0,2), NumberStyles.HexNumber);对于 r、g 和 b,依此类推。不要忘记将 Substring 的第一个参数 – 索引 – 替换为 r 的 2、g 的 4 和 b 的 6。

torvin 回复 1月 前

@HansKesting,FromArgb接受 1 个参数System.Drawing.Color和 4 个参数System.Windows.Media.Color

apc 回复 1月 前

请注意,这适用于 4 字节(例如 #FFFFFFFF)HTML 颜色(inc alpha)。如果您尝试使用 3 字节 (#FFFFFF),则 alpha 将为 0,并且您的颜色透明。如果颜色代码少于 8/9 个字符,您可以轻松插入 alpha。非常适合紧凑型框架。

MrPaulch 回复 1月 前

这也不适用于简写的 3 或 4 位颜色定义。

0
Jink 回答 1月 前

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

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();
GeekPeek 回复 1月 前

也许是一个愚蠢的问题,而且有点晚了,但你为什么使用 -16777216 作为 alpha 值?

too 回复 1月 前

始终使用十六进制的小变化: return Color.FromArgb((byte)((argb & 0xff000000) >> 0x18), (byte)((argb & 0xff0000) >> 0x10), (byte)((argb & 0xff00) >> 0x08), (字节)(argb & 0xff));

SameOldNick 回复 1月 前

这段代码有问题。我不知道为什么什么都没有出现,结果证明是因为这段代码没有将十六进制转换为Color适当地。我使用了@too 的代码并修复了它。

Mojtaba Rezaeian 回复 1月 前

这里有一个以前的版本这个答案:http://stackoverflow.com/a/784852/2721611

Nyerguds 回复 1月 前

你可以做& 0xFF每次都在最终的降档值上,而不是需要所有这些不同的值&它与。

mbomb007 回复 1月 前

@Nyerguds 同意。然后移位值将是 2 的幂。

Nyerguds 回复 1月 前

Color.FromArgb有一个简单地接受一个重载Int32尽管?我是说,System.Drawing.Color当然可以。

0
demp 回答 1月 前

下面的三个变体给出完全相同的颜色。最后一个的好处是在 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);
Sinatr 回复 1月 前

这些都没有回报System.Windows.Media.Color.

0
ConfusedDeer 回答 1月 前

我需要将 HEX 颜色代码转换为 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));