如何将RGBA css颜色格式转换为十六进制格式

vic*_*vic 7 css c# colors selenium-webdriver

在我的硒代码中,我需要验证颜色代码是#192856的背景.但当我得到该元素的CSS属性时,它给我的颜色为rgba格式.现在我需要以十六进制值本身获取值.我怎样才能做到这一点?

quickLinkstab.GetCssValue("background-color")
Run Code Online (Sandbox Code Playgroud)

上面给出的是"rgba(25,40,86,1)"的值,即rgba值.有什么方法可以将它转换回Hex吗?或者我可以在Hex本身获得价值?

我也试过下面的代码

 string colorcode = menuColor;
        int argb = Int32.Parse(colorcode.Replace("#", ""), NumberStyles.HexNumber);
        Color clr = Color.FromArgb(argb);


        int r = Convert.ToInt16(clr.R);
        int g = Convert.ToInt16(clr.G);
        int b = Convert.ToInt16(clr.B);
        int a = Convert.ToInt16(clr.A);
        string x = string.Format("rgba({0}, {1}, {2}, {3});", r, g, b,a);
Run Code Online (Sandbox Code Playgroud)

但是这个给我的价值就像"rgba(25,40,86,0);" ."a"值的差异.就像我的代码给我0代表"a"但cssvalue是1.

我更倾向于直接获取Hex值的解决方案,或者如果不可能,则将rgba转换为Hex.

Tom*_*bes 7

以下代码涵盖十六进制格式,rgb格式和rgba格式.

public static class ColorHelper
{
    public static Color ParseColor(string cssColor)
    {
        cssColor = cssColor.Trim();

        if (cssColor.StartsWith("#"))
        {
            return ColorTranslator.FromHtml(cssColor);
        }
        else if (cssColor.StartsWith("rgb")) //rgb or argb
        {
            int left = cssColor.IndexOf('(');
            int right = cssColor.IndexOf(')');

            if (left < 0 || right < 0)
                throw new FormatException("rgba format error");
            string noBrackets = cssColor.Substring(left + 1, right - left - 1);

            string[] parts = noBrackets.Split(',');

            int r = int.Parse(parts[0], CultureInfo.InvariantCulture);
            int g = int.Parse(parts[1], CultureInfo.InvariantCulture);
            int b = int.Parse(parts[2], CultureInfo.InvariantCulture);

            if (parts.Length == 3)
            {
                return Color.FromArgb(r, g, b);
            }
            else if (parts.Length == 4)
            {
                float a = float.Parse(parts[3], CultureInfo.InvariantCulture);
                return Color.FromArgb((int)(a * 255), r, g, b);
            }
        }
        throw new FormatException("Not rgb, rgba or hexa color string");
    }
}
Run Code Online (Sandbox Code Playgroud)

预期成绩:

[TestClass]
public class ColorParserTest
{
    [TestMethod]
    public void TestParseColorRGB()
    {
        Color c = ColorHelper.ParseColor("rgb(110,120,130)");

        Assert.AreEqual(110, c.R);
        Assert.AreEqual(120, c.G);
        Assert.AreEqual(130, c.B);
        Assert.AreEqual(255, c.A);
    }

    [TestMethod]
    public void TestParseColorRGBA()
    {
        Color c = ColorHelper.ParseColor("rgba(110,120,130,0.5)");

        Assert.AreEqual(110, c.R);
        Assert.AreEqual(120, c.G);
        Assert.AreEqual(130, c.B);
        Assert.AreEqual(127, c.A);
    }

    [TestMethod]
    public void TestParseColorHexa()
    {
        Color c = ColorHelper.ParseColor("#192856");

        Assert.AreEqual(25, c.R);
        Assert.AreEqual(40, c.G);
        Assert.AreEqual(86, c.B);
        Assert.AreEqual(255, c.A);
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*aio 0

这应该可以解决问题。

public static string ConvertRgbaToHex(string rgba)
{
    if (!Regex.IsMatch(rgba, @"rgba\((\d{1,3},\s*){3}(0(\.\d+)?|1)\)"))
            throw new FormatException("rgba string was in a wrong format");

    var matches = Regex.Matches(rgba, @"\d+");
    StringBuilder hexaString = new StringBuilder("#");

    for(int i = 0; i < matches.Count - 1; i++)
    {
        int value = Int32.Parse(matches[i].Value);

        hexaString.Append(value.ToString("X"));
    }

    return hexaString.ToString();
}
Run Code Online (Sandbox Code Playgroud)

测试用例:

public class Program
{
    static void Main(string[] args)
    {
        // Output: #192856
        Console.WriteLine(ConvertRgbaToHex("rgba(25, 40, 86, 1)"));

        Console.Read();
    }

    public static string ConvertRgbaToHex(string rgba)
    {
        if (!Regex.IsMatch(rgba, @"rgba\((\d{1,3},\s*){3}(0(\.\d+)?|1)\)"))
                throw new FormatException("rgba string was in a wrong format");

        var matches = Regex.Matches(rgba, @"\d+");
        StringBuilder hexaString = new StringBuilder("#");

        for(int i = 0; i < matches.Count - 1; i++)
        {
            int value = Int32.Parse(matches[i].Value);

            hexaString.Append(value.ToString("X"));
        }

        return hexaString.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)