为什么不简单:
我的问题与Convert RGBA color to 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十六进制字符串的格式为#AARRGGBB
(source)。
要覆盖4位而不是8位的情况,您可以使用类似以下内容:
int alphaDigits = (argb.Length == 9 ? 2 : 1);
string rgb = argb.Remove(1, alphaDigits);
注:
第三种解决方案是使用ColorTranslator
类,这是有效的,因为:
ColorTranslator
方法使用ColorTranslator.FromHtml()
ColorConverter.ConvertFrom
(可以解析ARGB十六进制值)。
internally然后仅忽略alpha值,仅使用RGB值生成字符串1
。ColorTranslator.ToHtml
这是一些测试代码,表明该解决方案将适用于所有可能的ARGB十六进制值:Color c = ColorTranslator.FromHtml("#FFFF0000");
string rgb = ColorTranslator.ToHtml(c);
1
但是,请记住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}'");
}
不一定会返回RGB十六进制字符串。如果颜色具有已知的颜色名称(适用于HTML),它将尝试返回颜色名称;否则,它采用ColorTranslator.ToHtml()
格式的RGB十六进制值。为什么不简单:
注: