ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

哈希码可能是指#00ff00?
Viky - 不要将其称为哈希码。这很令人困惑。 ;-) 它是颜色的十六进制表示。
#FF0000 是 HTML(或十六进制)颜色代码,而不是哈希代码。请学习区别。
符号 # 在许多国家被称为散列,因此会造成混淆。
@斧头???您可能误解了 C# 中的 GetHashCode() 的作用。 GetHashCode() 是 .NET 中每个对象的方法。它不会从 Color 类返回十六进制值。

T
Thorarin

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

using System.Windows.Media;

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

@Thorarin 关于如何获取 alpha 值的任何帮助,因为我需要将此值转换为与用于网页设计的 css rgba 兼容。
@Yoda前两位数字(FF)是alpha值。不过,在这种情况下使用 Color.FromArgb 方法可能更容易。如果使用浮点 alpha,则必须乘以 255。
如果您有 RGB 值 -> Color.FromArgb(255,192,0)
字符串十六进制 = "#FFFFFF";颜色 _color = System.Drawing.ColorTranslator.FromHtml(hex);
为什么不改用 color.FromArgb() 呢?
T
T.Todua

假设您指的是 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") ;

H
Hans Kesting

如果你不想使用 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 个字符的十六进制值)


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

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

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

也许是一个愚蠢的问题,而且有点晚了,但你为什么使用 -16777216 作为 alpha 值?
始终使用十六进制的小变化: return Color.FromArgb((byte)((argb & 0xff000000) >> 0x18), (byte)((argb & 0xff0000) >> 0x10), (byte)((argb & 0xff00) >> 0x08), (字节)(argb & 0xff));
这段代码有问题。我不知道为什么什么都没有出现,结果证明是因为这段代码没有正确地将十六进制转换为 Color。我使用了@too 的代码并修复了它。
您可以每次只对最终的降档值执行 & 0xFF,而不需要所有这些不同的值来&
Color.FromArgb 没有简单地接受 Int32 的重载吗?我的意思是,System.Drawing.Color 确实如此。
P
Peter Mortensen

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

这些都不返回 System.Windows.Media.Color
C
ConfusedDeer

我需要将 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));

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

在 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));
P
Peter Mortensen

您可以使用以下代码:

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

P
Peter Mortensen

如果您想使用 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));

J
Justin

这篇文章已成为任何试图从十六进制颜色代码转换为系统颜色的人的首选。因此,我想我会添加一个处理 6 位 (RGB) 和 8 位 (ARGB) 十六进制值的综合解决方案。

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

alpha 值隐含为 255(完全不透明)。

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

    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 回答的启发。


P
Peter Mortensen

您可以看到 Silverlight/WPF sets ellipse with hexadecimal colour 使用十六进制值:

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

P
Peter Mortensen

利用

System.Drawing.Color.FromArgb(myHashCode);

浏览从十六进制字符串到 int 的转换?
最初的问题是“如何从哈希码中获取颜色”,这在这里造成了很多混乱。 ;-)
K
Khalil Al-rahman Yossefi

在 asp.net 中:

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

ColorConverterSystem.DrawingSystem.Windows.Media 中可用。你指的是哪一个(两者都与 ASP.NET 无关)?
System.Drawing 中的 ColorConverter 可以在 ASP.NET 中使用
T
TERIHAX

您可以使用 ColorConverter.ConvertFromString(string) 方法将您的字符串(十六进制)转换为颜色。

示例:(这适用于 ARGB,例如“#FF1E1E1E”。

Control.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#1E1E1E"));

M
Max Truxa

WPF:

using System.Windows.Media;

//hex to color
Color color = (Color)ColorConverter.ConvertFromString("#7AFF7A7A");

//color to hex
string hexcolor = color.ToString();

实际上,没有十六进制,只有 Color [Indigo]
C
Cevdet

我在我的项目中使用了 ColorDialog。 ColorDialog 有时返回“Red”、“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 的返回值。

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


M
MrPaulch

这里已经有很多答案了。

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

我知道有些人想避免使用 System.Windows.Media,所以还有另一种解决方案,既然您想要一个 System.Drawing.Color,您应该在您的项目中已经引用了 System.Drawing

简而言之:如果可以,请使用框架。

更完整的原生解决方案

因此,如果出于某种原因您想避免 System.Drawing.ColorTranslator 并创建自己的实现,您至少应该使其尊重 specifications

所以这是一个使用 #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");
        }
    }

如果您出于某种原因不想使用 System.Globalization,我相信您会发现一个用于解析十六进制符号的代码。

测试

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

PS:随意删除参数,他们只是想展示如何调整函数来处理格式错误和默认值。

PPS:目前错误消息的描述性不是很好


S
Saamer

对于那里的任何 Xamarin 开发人员,您需要

指定颜色类型以防止 Cast 异常假设您正在谈论 Xamarin.Forms.Color 创建一个 ColorConverter 类型的对象

var conv = new System.Drawing.ColorConverter();
var color = (System.Drawing.Color)conv.ConvertFromString("#FF1D65AE");

G
Gerhard Schreurs

XNA / Monogame (Microsoft.Xna.Framework.Color)。

适用于 6 或 8 个(带字母)字符的十六进制字符串

可能有更好的选择(位屏蔽/移位)。

    using Microsoft.Xna.Framework;
    using System.Globalization;
    
    public static class ColorBuilder
    {
        public static Color FromHex(string color)
        {
            var hex = color.Replace("#", string.Empty);
            var h = NumberStyles.HexNumber;

            var r = int.Parse(hex.Substring(0, 2), h);
            var g = int.Parse(hex.Substring(2, 2), h);
            var b = int.Parse(hex.Substring(4, 2), h);
            var a = 255;

            if (hex.Length == 8)
            {
                a = int.Parse(hex.Substring(6, 2), h);
            }
 
            return new Color(r, g, b, a);
        }
    }
    
    //create a blue color
    var color = ColorBuilder.FromHex("#2733C5"); //or ColorBuilder.FromHex("2733C5");
    
    //create a blue color with 50% alpha
    var colorTrans = ColorBuilder.FromHex("#2733C580");


P
Peter Mortensen

如果你指的是 .GetHashCode() 中的 HashCode,恐怕你回不去了。哈希函数不是双向的,您只能“前进”,不能后退。

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


@Wim感谢您帮助OP澄清问题。我会说不再需要这个答案,并建议删除它。