在ASP.NET Core中从十六进制获取颜色

4

在ASP.NET Core中如何从十六进制值获取颜色?

我发现System.Drawing命名空间中的Color类,但没有适用的FromHex方法。

我需要转换如下数值:

#F3A
#2F3682
#83A7B278

你到目前为止尝试了什么?我猜(查看 .NET Standard API 文档:https://apisof.net/catalog/System.Drawing.ColorTranslator),`System.Drawing.ColorTranslator` 在 .NET Core 中不可用。如果是这样,那么您编写的代码是否必须针对 .NET Core?(例如,您可以创建一个 .NET Framework 应用程序/库) - Jamie Taylor
我理解您需要将字符串中的值转换。您能具体说明此操作的目标格式吗? - Leonid
@JamieTaylor 我尝试了使用GoogleStackOverflow,但我没有找到解决方案,所以我认为这是一个适合在SO上提问的问题。 - Makla
2个回答

8

我发现corefx包含System.Drawing.Common,因此您可以使用

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

源代码可以在这里找到:GitHub


谢谢。看源代码,我认为它没有处理阿尔法通道。 - Makla

7

我没有找到可以处理alpha的库,所以我自己编写了一个。

using System;
using System.Drawing;
using System.Globalization;

namespace Color.Library
{
    public class ColorManager
    {
        public static Color FromHex(string hex)
        {
            FromHex(hex, out var a, out var r, out var g, out var b);

            return Color.FromArgb(a, r, g, b);
        }

        public static void FromHex(string hex, out byte a, out byte r, out byte g, out byte b)
        {
            hex = ToRgbaHex(hex);
            if (hex == null || !uint.TryParse(hex, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var packedValue))
            {
                throw new ArgumentException("Hexadecimal string is not in the correct format.", nameof(hex));
            }

            a = (byte) (packedValue >> 0);
            r = (byte) (packedValue >> 24);
            g = (byte) (packedValue >> 16);
            b = (byte) (packedValue >> 8);
        }


        private static string ToRgbaHex(string hex)
        {
            hex = hex.StartsWith("#") ? hex.Substring(1) : hex;

            if (hex.Length == 8)
            {
                return hex;
            }

            if (hex.Length == 6)
            {
                return hex + "FF";
            }

            if (hex.Length < 3 || hex.Length > 4)
            {
                return null;
            }

            //Handle values like #3B2
            string red = char.ToString(hex[0]);
            string green = char.ToString(hex[1]);
            string blue = char.ToString(hex[2]);
            string alpha = hex.Length == 3 ? "F" : char.ToString(hex[3]);


            return string.Concat(red, red, green, green, blue, blue, alpha, alpha);
        }
    }
}

应用场景:

ColorManager.FromHex("#C3B271");
ColorManager.FromHex("#CCC");
ColorManager.FromHex("#C3B27144");
ColorManager.FromHex("#C3B27144", out var a, out var r, out var g, out var b);

我从ImageSharp库中借用了大部分代码。


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