使用十进制值处理RGBA

时间:2014-01-28 14:22:26

标签: c# regex colors

我有一个值: RGBA(1.000,0.000,0.000,0.090)

我需要在网格单元格中绘制它。

到目前为止,我有以下代码:

var matches = Regex.Matches(e.CellValue.ToString(), @"([0-9]+\.[0-9]+)");

if (matches.Count == 4)
{
    Color.FromArgb(matches[4].Value, matches[0].Value, matches[1].Value, matches[2].Value);
}

事情是,Color.FromArgb仅与Int32打交道。就我所见,Color.下的所有功能都是Int32处理。我如何管理精度?

感谢。

3 个答案:

答案 0 :(得分:2)

你做的是: 使用您提供的正则表达式解析零件,使用零件根据0-255的范围计算适当的整数值,并组合零件以形成颜色。

var regex = new Regex(@"([0-9]+\.[0-9]+)");
string colorData = "RGBA(1.000, 0.000, 0.000, 0.090)";

var matches = regex.Matches(colorData);
int r = GetColorValue(matches[0].Value);
int g = GetColorValue(matches[1].Value);
int b = GetColorValue(matches[2].Value);
int a = GetColorValue(matches[3].Value);

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


private static int GetColorValue(string match)
{
    return (int)Math.Round(double.Parse(match, CultureInfo.InvariantCulture) * 255);
}

答案 1 :(得分:1)

Color.FromArgb使用不同的值刻度,其中值介于0到255之间。 我还没有测试过,但它应该是这样的:

   public Color FromArgbFloat(float alpha, float r, float g, float b)
   {
      return Color.FromArgb((int)Math.Round(alpha*255), (int)Math.Round(r*255), (int)Math.Round(g*255), Math.Round(b*255);
   }

答案 2 :(得分:1)

Color.FromArgb适用于int 0到255,您可以将代码更改为:

Color.FromArgb(Transform(matches[3].Value), Transform(matches[0].Value), Transform(matches[1].Value), Transform(matches[2].Value));

// ...

private int Transform(double value)
{
    return (int)Math.Round(value*255);
}