Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用.NET从十六进制颜色代码中获取颜色?_C#_Wpf_Colors_Hex - Fatal编程技术网

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

C# 如何使用.NET从十六进制颜色代码中获取颜色?,c#,wpf,colors,hex,C#,Wpf,Colors,Hex,如何从十六进制颜色代码(例如FFDFD991)中获取颜色 我正在读一个文件,得到一个十六进制的颜色代码。我需要为十六进制颜色代码创建相应的System.Windows.Media.Color实例。框架中是否有内置方法来执行此操作?假设您指的是称为十六进制代码的HTML类型RGB代码,如FFCC66,则使用类: 但是,如果您使用的是ARGB十六进制代码,则可以使用System.Windows.Media命名空间中的类: Color col = ColorConverter.ConvertFromS

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


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

假设您指的是称为十六进制代码的HTML类型RGB代码,如FFCC66,则使用类:

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

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

如果您是指.GetHashCode中的HashCode,恐怕您不能返回。散列函数不是双向的,只能“前进”,不能后退

如果需要根据颜色的十六进制值获取颜色,请遵循Oded的建议。

使用

System.Drawing.Color.FromArgb(myHashCode);

如果您不想使用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:numberstyle在System.Globalization中。
注2:请提供您自己的错误检查颜色代码应为6或8个字符的十六进制值

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

using System.Windows.Media;

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

您可以使用以下代码:

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

还有一种简洁的小扩展方法:

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();
您可以看到如何使用十六进制值:

your_contorl.Color = DirectCast(ColorConverter.ConvertFromString("#D8E0A627"), Color)

以下三种变体的颜色完全相同。最后一个好处是在VisualStudio2010 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);
WPF:


这篇文章已经成为任何试图将十六进制颜色代码转换为系统颜色的人的必经之路。因此,我想我应该添加一个处理6位RGB和8位ARGB十六进制值的综合解决方案

根据微软的说法,默认情况下,当从RGB值转换为ARGB值时

alpha值隐式地是完全不透明的

这意味着通过将FF添加到6位RGB十六进制颜色代码,它将成为8位ARGB十六进制颜色代码。因此,可以创建一个简单的方法来处理ARGB和RGB十六进制,并将它们转换为适当的颜色结构

    public static System.Drawing.Color GetColorFromHexValue(string hex)
    {
        string cleanHex = hex.Replace("0x", "").TrimStart('#');

        if (cleanHex.Length == 6)
        {
            //Affix fully opaque alpha hex value of FF (225)
            cleanHex = "FF" + cleanHex;
        }

        int argb;

        if (Int32.TryParse(cleanHex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out argb))
        {
            return System.Drawing.Color.FromArgb(argb);
        }

        //If method hasn't returned a color yet, then there's a problem
        throw new ArgumentException("Invalid Hex value. Hex must be either an ARGB (8 digits) or RGB (6 digits)");

    }

这是由Hans Kesting的答案启发而来的。

如果您想使用Windows应用商店应用程序,请点击@Hans Kesting和@Jink answer:

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

我需要将十六进制颜色代码转换为System.Drawing.color,特别是WPF表单上的背景色Alice Blue,我发现找到答案的时间比预期的要长:

using System.Windows.Media;
-


我在我的项目中使用了ColorDialog。ColorDialog有时返回红色、Fhushia,有时返回fff000。我就这样解决了这个问题也许能帮助别人

        SolidBrush guideLineColor;
        if (inputColor.Any(c => char.IsDigit(c)))
        {
            string colorcode = inputColor;
            int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
             guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));

        }
        else
        {
            Color col = Color.FromName(inputColor);
             guideLineColor = new SolidBrush(col);
        }
InputColor是ColorDialog的返回值

谢谢大家回答这个问题。这对我帮助很大。

在asp.net中:

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

这里已经有很多答案了

简而言之,我支持那些建议使用System.Drawing.ColorTranslator的人

我知道有些人不想使用System.Windows.Media,所以还有另一种解决方案,因为您希望使用System.Drawing.Color,所以您的项目中应该已经有了对System.Drawing的引用

因此,简而言之:如果可以,请使用该框架

更完整的本机解决方案 因此,如果出于某种原因,您希望避免System.Drawing.ColorTranslator并创建自己的实现,您至少应该让它尊重

因此,这是一个解决方案,它可以实现RGB和RGBA的速记和扩展颜色定义

    public static Color ParseHtmlColor(string htmlColor) => Color.FromArgb(HtmlColorToArgb(htmlColor));

    public static int HtmlColorToArgb(string htmlColor, bool requireHexSpecified = false, int defaultAlpha = 0xFF)
    {

        if (string.IsNullOrEmpty(htmlColor))
        {
            throw new ArgumentNullException(nameof(htmlColor));
        }

        if (!htmlColor.StartsWith("#") && requireHexSpecified)
        {
            throw new ArgumentException($"Provided parameter '{htmlColor}' is not valid");
        }

        htmlColor = htmlColor.TrimStart('#');
        

        // int[] symbols 
        var symbolCount = htmlColor.Length;
        var value = int.Parse(htmlColor, System.Globalization.NumberStyles.HexNumber);
        switch (symbolCount)
        {
            case 3: // RGB short hand
            {
                return defaultAlpha << 24
                    | (value & 0xF)
                    | (value & 0xF) << 4
                    | (value & 0xF0) << 4
                    | (value & 0xF0) << 8
                    | (value & 0xF00) << 8
                    | (value & 0xF00) << 12
                    ;
            }
            case 4: // RGBA short hand
            {
                // Inline alpha swap
                return   (value & 0xF) << 24
                       | (value & 0xF) << 28
                       | (value & 0xF0) >> 4
                       | (value & 0xF0) 
                       | (value & 0xF00) 
                       | (value & 0xF00) << 4
                       | (value & 0xF000) << 4
                       | (value & 0xF000) << 8
                       ;
            }
            case 6: // RGB complete definition
            {
                return defaultAlpha << 24 | value;   
            }
            case 8: // RGBA complete definition
            {
                // Alpha swap
                return (value & 0xFF) << 24 | (value >> 8);
            }
            default:
                throw new FormatException("Invalid HTML Color");
        }
    }
附言: 请随意删除这些参数,它们只是想说明如何调整函数以处理格式错误和默认值

p.p.S.:
错误消息目前不是非常具有描述性的哈希代码,可能它们的意思是00ff00?Viky-不要将其称为哈希代码。这很令人困惑它是颜色的十六进制表示形式。FF0000是HTML或十六进制颜色代码,而不是哈希代码。请了解其中的区别。这个符号在许多国家被称为哈希,因此产生了混淆。@axeman???您可能误解了C中GetHashCode的功能。GetHashCode是.NET中每个对象上的一个方法。它不会从颜色类返回十六进制值。浏览从十六进制字符串到int的转换?最初的问题是如何从哈希代码中获取颜色,这在这里造成了很多混乱-可能是一个愚蠢的问题,而且有点晚,但是为什么要使用-16777216作为alpha值呢?始终使用十六进制的小变化:返回颜色。FromArgbByTargb&0xff000000>>0x18,byteargb&0xff0000>>0x10,byteargb&0xff00>>0x08,byteargb&0xff;这个代码有错误。我不明白为什么
othing出现了,结果是因为这个代码没有正确地将十六进制转换为颜色。我也使用了@中的代码,这就解决了它。这里有一个以前的版本,这个答案是这样的:您每次只需对最终的降档值执行&0xFF,而不需要所有这些不同的值即可&it with.Color.FromArgb需要a、r、g和b参数,不是整数。如果您使用的是不支持ColorTranslator的紧凑框架,这也很有用available@user1763532-在colorcode=colorcode.Replace之后,只需使用int a=byte.parsecolorcode.Substring0,2,NumberStyles.HexNumber;对于r,g,b等等。不要忘记将子字符串的第一个参数(索引)替换为2表示r,4表示g,6表示b。@HansKesting,FromArgb在System.Drawing.Color中取1个参数,在System.Windows.Media.Color中取4个参数。注意这适用于4字节,例如FFFFFFFF HTML Color inc alpha。如果您尝试使用3字节FFFFFF,则alpha将为0,并且颜色透明。如果颜色代码小于8/9个字符,则可以轻松插入alpha。非常适用于Compact Framework。@Thorarin关于如何获取alpha值的任何帮助,因为我需要将此值转换为与css rgba for web design兼容。@Yoda前两位数字FF是alpha值。不过,在这种情况下,使用Color.FromArgb方法可能更容易。如果使用浮点alpha,则必须乘以255。如果使用RGB值->颜色,则必须使用argb255192,0string hex=ffffffff;颜色_Color=System.Drawing.ColorTranslator.FromHtmlhex;为什么不改用color.FromArgb呢?这些都不会返回System.Windows.Media.color。实际上,UWP color中没有十六进制,只有color[Indigo]。FromArgb需要4字节的参数。所以它看起来像:返回Color.FromArgb255,byte.Parsehex.Substring0,2,System.Globalization.NumberStyles.HexNumber,byte.Parsehex.Substring2,2,System.Globalization.NumberStyles.HexNumber,byte.Parsehex.Substring4,2,System.Globalization.NumberStyles.HexNumber@Wim感谢您帮助OP澄清问题。我认为不再需要这个答案,建议删除它。System.Drawing和System.Windows.Media中都有ColorConverter。你是说哪一个和ASP.NET无关?系统中的ColorConverter。绘图可以在ASP.NET中使用
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));
        SolidBrush guideLineColor;
        if (inputColor.Any(c => char.IsDigit(c)))
        {
            string colorcode = inputColor;
            int argbInputColor = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
             guideLineColor = new SolidBrush(Color.FromArgb(argbInputColor));

        }
        else
        {
            Color col = Color.FromName(inputColor);
             guideLineColor = new SolidBrush(col);
        }
color_black = (Color)new ColorConverter().ConvertFromString("#FF76B3");
    public static Color ParseHtmlColor(string htmlColor) => Color.FromArgb(HtmlColorToArgb(htmlColor));

    public static int HtmlColorToArgb(string htmlColor, bool requireHexSpecified = false, int defaultAlpha = 0xFF)
    {

        if (string.IsNullOrEmpty(htmlColor))
        {
            throw new ArgumentNullException(nameof(htmlColor));
        }

        if (!htmlColor.StartsWith("#") && requireHexSpecified)
        {
            throw new ArgumentException($"Provided parameter '{htmlColor}' is not valid");
        }

        htmlColor = htmlColor.TrimStart('#');
        

        // int[] symbols 
        var symbolCount = htmlColor.Length;
        var value = int.Parse(htmlColor, System.Globalization.NumberStyles.HexNumber);
        switch (symbolCount)
        {
            case 3: // RGB short hand
            {
                return defaultAlpha << 24
                    | (value & 0xF)
                    | (value & 0xF) << 4
                    | (value & 0xF0) << 4
                    | (value & 0xF0) << 8
                    | (value & 0xF00) << 8
                    | (value & 0xF00) << 12
                    ;
            }
            case 4: // RGBA short hand
            {
                // Inline alpha swap
                return   (value & 0xF) << 24
                       | (value & 0xF) << 28
                       | (value & 0xF0) >> 4
                       | (value & 0xF0) 
                       | (value & 0xF00) 
                       | (value & 0xF00) << 4
                       | (value & 0xF000) << 4
                       | (value & 0xF000) << 8
                       ;
            }
            case 6: // RGB complete definition
            {
                return defaultAlpha << 24 | value;   
            }
            case 8: // RGBA complete definition
            {
                // Alpha swap
                return (value & 0xFF) << 24 | (value >> 8);
            }
            default:
                throw new FormatException("Invalid HTML Color");
        }
    }
    public static void TestColors()
    {
        foreach (var testCase in TestCases) TestColor(testCase);
    }

    static string[] TestCases = new string[] { 
        "111",
        "FFF", 
        "17A",
        "F52",
        "444F",
        "2348",
        "4320",
        "121212",
        "808080",
        "FFFFFF",
        "A0E0C0",
        "0A070B",
        "FFFFFFFF",
        "808080FF",
        "40807710"
    };

    public static void TestColor(string htmlColor)
    {
        Console.Write($" {htmlColor} -> ");
        var color = ParseHtmlColor(htmlColor);
        Console.WriteLine("0x" + color.ToArgb().ToString("X"));
    }