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

vik*_*iky 565 c# wpf hex colors

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

我正在读取文件并获得十六进制颜色代码.我需要System.Windows.Media.Color为十六进制颜色代码创建相应的实例.框架中是否有内置方法来执行此操作?

Tho*_*rin 706

我假设这是一个ARGB代码...你是指System.Drawing.ColorSystem.Windows.Media.Color?例如,后者用于WPF.我还没有看到有人提到它,所以万一你正在寻找它:

using System.Windows.Media;

Color color = (Color)ColorConverter.ConvertFromString("#FFDFD991");
Run Code Online (Sandbox Code Playgroud)

  • string hex ="#FFFFFF"; Color _color = System.Drawing.ColorTranslator.FromHtml(hex); (46认同)
  • @Yoda前两位数(FF)是alpha值.在这种情况下,使用`Color.FromArgb`方法可能更容易.如果使用浮点alpha,则必须乘以255. (2认同)
  • 如果你有RGB值 - > Color.FromArgb(255,192,0) (2认同)
  • 为什么不改用 color.FromArgb() 呢? (2认同)

Ode*_*ded 535

假设您的意思是HTML类型的RGB代码(称为十六进制代码,例如#FFCC66),请使用ColorTranslator类:

System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#FFCC66");
Run Code Online (Sandbox Code Playgroud)

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

Color col = ColorConverter.ConvertFromString("#FFDFD991") as Color;
//or      = (Color) ColorConverter.ConvertFromString("#FFCC66") ;
Run Code Online (Sandbox Code Playgroud)


Han*_*ing 108

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

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

colorcode只是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));
Run Code Online (Sandbox Code Playgroud)

注1:NumberStyles位于System.Globalization中.
注2:请提供您自己的错误检查(颜色代码应为6或8个字符的十六进制值)

  • 如果您使用ColorTranslator不可用的Compact Framework,这也很有用 (7认同)
  • @ user1763532 - 在`colorcode = colorcode.Replace("#","")之后`简单地使用`int a = byte.parse(colorcode.Substring(0,2),NumberStyles.HexNumber);`等等为r, g,和b.不要忘记替换Substring的第一个参数 - 索引 - r为2,g为4,b为6. (7认同)
  • Color.FromArgb需要a,r,g和b参数,而不是整数. (3认同)
  • @HansKesting,`FromArgb`在`System.Drawing.Color`中有1个参数,在`System.Windows.Media.Color中有4个参数 (3认同)
  • 请注意,这适用于4字节(例如#FFFFFFFF)的HTML颜色(inc alpha)。如果尝试使用3字节(#FFFFFF),则alpha将为0,并且颜色透明。如果颜色代码少于8/9个字符,则可以轻松插入alpha。非常适合紧凑型框架。 (2认同)

小智 40

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

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

正在使用:

Color color = 0xFFDFD991.ToColor();
Run Code Online (Sandbox Code Playgroud)

  • 也许是一个愚蠢的问题,有点晚了,但为什么你使用-16777216作为alpha值? (6认同)
  • 使用十六进制一致的小变化:返回Color.FromArgb((byte)((argb&0xff000000)>> 0x18),(byte)((argb&0xff0000)>> 0x10),(byte)((argb&0xff00)>> 0x08),(byte)(argb&0xff)); (3认同)

dem*_*emp 37

下面的三个变体给出完全相同的颜色.最后一个具有在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);
Run Code Online (Sandbox Code Playgroud)

  • 这些都不会返回`System.Windows.Media.Color`. (6认同)

Bad*_*ack 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));
    }
Run Code Online (Sandbox Code Playgroud)

  • 在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)); (2认同)

小智 11

您可以使用以下代码:

Color color = System.Drawing.ColorTranslator.FromHtml("#FFDFD991");
Run Code Online (Sandbox Code Playgroud)


Con*_*eer 11

我需要将HEX颜色代码转换为System.Drawing.Color,特别是作为WPF表单背景的Alice Blue的阴影,发现找到答案需要比预期更长的时间:

using System.Windows.Media;
Run Code Online (Sandbox Code Playgroud)

-

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));
Run Code Online (Sandbox Code Playgroud)


Kha*_*efi 6

在 ASP.NET 中:

color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");
Run Code Online (Sandbox Code Playgroud)


You*_*jae 5

如果您想使用Windows应用商店应用,请关注@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));
Run Code Online (Sandbox Code Playgroud)