将 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.ConvertFrom
internally(可以解析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=]
我的问题与 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.ConvertFrom
internally(可以解析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=]