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

时间:2019-10-26 19:37:38

标签: c# colors hex converters

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

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

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

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

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用以16为底的

将十六进制字符串转换为整数值
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;

entity ClockGen is
    Port (    clk : in  STD_LOGIC;
               rst : in  STD_LOGIC;
           clkout : out STD_LOGIC);
end ClockGen;

architecture Behavioral of ClockGen is
    signal divider : std_logic_vector(3 downto 0) := (others => '0');
begin
    process(clk, rst)
    begin
        if (rst = '1') then
            divider <= "0000";
        elsif (rising_edge(clk)) then
            divider <= divider + '1';
        end if;
    end process;

    clkout <= divider(3);
end Behavioral;

然后使用

创建颜色
int argb = Convert.ToInt32("0xFFFF0000", 16);

最后,您可以获得一个只有RGB值的新十六进制字符串,

Color c = Color.FromArgb(argb);

答案 1 :(得分:0)

为什么不简单:

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);

答案 2 :(得分:0)

  

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

第三个解决方案是使用ColorTranslator类,这是因为:

  • 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()不一定会返回RGB十六进制字符串。如果颜色具有已知的颜色名称(适用于HTML),它将尝试返回颜色名称,否则,将使用#RRGGBB格式的RGB十六进制值。