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

问题描述 投票:0回答:3

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

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

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

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

谢谢

c# colors hex converters
3个回答
1
投票

您可以使用以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十六进制字符串的格式为#AARRGGBBsource)。

要覆盖4位而不是8位的情况,您可以使用类似以下内容:

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

注:

此解决方案尽管产生有效的HTML颜色值,但该值不必一定是RGB十六进制字符串,如下所述。

第三种解决方案是使用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十六进制值。

0
投票

为什么不简单:


0
投票

注:

© www.soinside.com 2019 - 2024. All rights reserved.