我的问题非常类似于将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十六进制值