将 ARGB 十六进制字符串转换为 RGB

Convert ARGB hex string to RGB

我的问题与 Convert RGBA color to RGB 非常相似,只是我有一个十六进制字符串而不是字节颜色值。

我正在使用 EPPlus,我希望将单元格背景颜色转换为 HTML 颜色。
单元格背景颜色来自这个 属性 ColorType.Rgb.
注意: 属性 说的是 Rgb,但正如文档所说,它实际上是 Argb。

在测试期间,我有一个 Red 单元格,其 Argb 十六进制为 #FFFF0000 但据我了解,在 HTML 中不支持 Alpha,红色的 Rgb 十六进制为 #FF0000.

我需要先将十六进制字符串转换为字节值,根据上一个答案执行计算,将 Rgb 字节转换为十六进制字符串。

谢谢

您可以将十六进制字符串转换为以 16 为底的整数值

int argb = Convert.ToInt32("0xFFFF0000", 16);

然后用

创建你的颜色
Color c = Color.FromArgb(argb);

最后你可以获得一个只有 RGB 值的新十六进制字符串

string rgb = $"#{c.R:X2}{c.G:X2}{c.B:X2}";

为什么不简单:

string argb = "#FFFF0000";
string rgb = argb.Remove(1, 2);

..因为 ARGB 十六进制字符串的格式是 #AARRGGBB (source)。这是最直接的解决方案(并且比基于转换的解决方案快得多)。

为了涵盖 4 位数字而不是 8 位数字的情况,您可以使用如下内容:

int alphaDigits = (argb.Length == 9 ? 2 : 1);
string rgb = argb.Remove(1, alphaDigits);

Note: This solution, although produces a valid HTML color value, that value doesn't necessarily have to be an RGB hex string as explained below. It's also significantly slower than my other solution.

第三种解决方案是使用 ColorTranslator class,因为:

  • ColorTranslator.FromHtml()方法使用ColorConverter.ConvertFrominternally(可以解析ARGB十六进制值)

  • 然后ColorTranslator.ToHtml只是忽略alpha值,只使用RGB值生成字符串1.

示例:

Color c = ColorTranslator.FromHtml("#FFFF0000");
string rgb = ColorTranslator.ToHtml(c);

下面是一些测试代码,表明此解决方案适用于所有可能的 ARGB 十六进制值:

try
{
    // Incrementing by 5 to save time. We can use `++` to cover all possible values
    // but it will take a long time to execute.
    for (int a = 0; a <= 255; a += 5)
        for (int r = 0; r <= 255; r += 5)
            for (int g = 0; g <= 255; g += 5)
                for (int b = 0; b <= 255; b += 5)
                    ColorTranslator.FromHtml($"#{a.ToString("X2")}{r.ToString("X2")}" +
                                             $"{g.ToString("X2")}{b.ToString("X2")}");
    Console.WriteLine("All is good!");
}
catch (FormatException ex)
{
    Console.WriteLine($"Failed. Message='{ex.Message}'");
}

1但是,请记住 ColorTranslator.ToHtml() 不一定 return RGB 十六进制字符串。如果颜色具有已知的颜色名称(适用于 HTML),它会尝试 return 颜色名称,否则,它会采用 #RRGGBB.[= 格式的 RGB 十六进制值。 47=]