首页 > 解决方案 > 如何从 ARGB 中删除重复的字符

问题描述

我正在尝试获取十六进制形式的 rgb 颜色

public string GetCssValue(IWebElement iwe, string cssValue)
{
    var value = iwe.GetCssValue(cssValue);
    string[] numbers = value.Replace("rgba(", "").Replace(")", "").Split(",");

    int a = int.Parse(numbers[0]);
    int r = int.Parse(numbers[1]);
    int g = int.Parse(numbers[2]);
    int b = int.Parse(numbers[3]);

    Color myColor = Color.FromArgb(a, r, g, b);

    string hex = "#" + myColor.A.ToString("X2") + myColor.R.ToString("X2") + 
        myColor.G.ToString("X2") + myColor.B.ToString("X2");

这里的十六进制是获取值 #FFEEEE01 而我页面上的 css 是 #fee 以便我可以比较两个字符串(预期的,实际的)

我怎样才能将#fee 作为我的十六进制值。这个X2在这里代表什么

标签: c#selenium-webdriverargb

解决方案


更改代码以返回值的一种快速方法是仅连接值中的第一个字符RGB

string hex = "#" + myColor.R.ToString("X2")[0] + myColor.G.ToString("X2")[0] + 
    myColor.B.ToString("X2")[0];

但是,由于只有 6 位代码的子集可以准确地转换为 3 位代码(只有那些具有重复字符的代码),所以编写一个帮助方法来转换值可能会有所帮助:

public string GetThreeDigitRGB(Color color)
{
    // Get the 2-character RGB color codes
    var r = color.R.ToString("X2");
    var g = color.G.ToString("X2");
    var b = color.B.ToString("X2");

    // Every color must have a repeating character for its code, otherwise we return null
    return r[0] == r[1] && g[0] == g[1] && b[0] == b[1]
        ? $"#{r[0]}{g[0]}{b[0]}"
        : null;
}

然后可以修改您的原始代码以Color从输入创建一个对象并将其传递给我们上面的辅助方法以获取 3 位代码(另请注意我们以 RGBA 顺序获取颜色值的更改,这就是它们的方式重新传入):

public string GetCssValue(IWebElement iwe, string cssValue)
{
    var value = iwe.GetCssValue(cssValue);
    string[] numbers = value.Replace("rgba(", "").Replace(")", "").Split(",");

    // Note the change to get the colors in the correct order
    int r = int.Parse(numbers[0]);
    int g = int.Parse(numbers[1]);
    int b = int.Parse(numbers[2]);
    int a = int.Parse(numbers[3]);

    // Create a color from the values
    Color myColor = Color.FromArgb(a, r, g, b);

    // Call our helper method to get the three digit code from the color
    return GetThreeDigitRGB(myColor);
}

推荐阅读