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



我的问题非常类似于将RGBA颜色转换为RGB,只是我有一个十六进制字符串,而不是字节颜色值。

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

在测试过程中,我有一个红色单元格,它的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十六进制字符串的格式是CCD_ 3(源(。这是最简单的解决方案(而且比基于转换的解决方案快得多(。

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

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

注意:此解决方案虽然生成有效的HTML颜色值,但该值不一定是RGB十六进制字符串,如下所述。它也比我的其他解决方案慢得多。

第三种解决方案是使用ColorTranslator类,它的工作原理是:

  • ColorTranslator.FromHtml()方法在内部使用ColorConverter.ConvertFrom(可以解析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()不一定会返回RGB十六进制字符串。如果颜色有已知的颜色名称(适用于HTML(,它会尝试返回颜色名称,否则,它会使用#RRGGBB格式的RGB十六进制值

最新更新