我的问题与Convert RGBA color to RGB非常相似,只是我有一个十六进制字符串而不是字节颜色值。
我正在与EPPlus合作,希望将单元格背景色转换为HTML颜色。
单元格背景色来自此属性ColorType.Rgb。
注意:该属性为Rgb,但正如文档所述,它实际上是Argb。
在测试期间,我有一个红色单元格的Argb十六进制为#FFFF0000
,但据我了解,在HTML中,不支持Alpha,红色的Rgb十六进制为#FF0000
。
我需要首先将十六进制字符串转换为字节值,根据上一个答案执行计算,将Rgb字节转换为十六进制字符串。
谢谢
答案 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十六进制字符串的格式为#AARRGGBB
(source)。这是最简单的解决方案(比基于转换的解决方案要快得多)。
要覆盖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十六进制值。