C# 使用十进制值处理RGBA

C# 使用十进制值处理RGBA,c#,regex,colors,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].V

我有一个值: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
处理。我如何在这里管理精度


谢谢

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

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

Color.FromArgb
与从0到255的
int
配合使用,您可以将代码更改为:

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

Color.FromArgb
与从0到255的
int
配合使用,您可以将代码更改为:

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);
}
你要做的是: 使用您提供的正则表达式解析这些部分,使用这些部分根据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);
}
你要做的是: 使用您提供的正则表达式解析这些部分,使用这些部分根据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);
}

很好,但我得到一个错误:无法隐式地将类型“double”转换为“int”。存在显式转换(是否缺少转换?)是的,缺少转换,索引4必须是3。我修复了这个问题。很好,但我得到一个错误:无法隐式地将类型“double”转换为“int”。存在显式转换(是否缺少转换?)是的,缺少转换,索引4必须是3。我已修复此问题。相同的错误:无法将类型“double”隐式转换为“int”。存在显式转换(是否缺少强制转换?)是否确定错误消息显示“无法将类型“double”隐式转换为“int”。这很奇怪,因为我的代码段根本没有使用double。相同的错误:无法将类型“double”隐式转换为“int”。存在显式转换(是否缺少强制转换?)是否确定错误消息显示“无法将类型“double”隐式转换为“int”。这很奇怪,因为我的代码片段根本没有使用double。那么,反向过程是什么呢?也就是说,从System.Drawing.Color到四个整数?我现在有了这么多`var c=BitConverter.GetBytes(GetColor().ToArgb());α=c[0];红色=c[1];绿色=c[2];蓝色=c[3];}`或者color.R、color.G、color.B等,有一些属性可以使其工作是的,它们是字节类型。我想用精度RGBA(1.000,0.000,0.000,0.090)将字节转换为双精度并除以255.0,然后反向过程是什么?也就是说,从System.Drawing.Color到四个整数?我现在有了这么多`var c=BitConverter.GetBytes(GetColor().ToArgb());α=c[0];红色=c[1];绿色=c[2];蓝色=c[3];}`或者color.R、color.G、color.B等,有一些属性可以使其工作是的,它们是字节类型。我想用精度RGBA(1.000,0.000,0.000,0.090)将字节转换为双精度并除以255.0,将其缩回原始Int32