2013-05-08 135 views

回答

3

Color类只能通过两种方式创建自定义颜色对象:

  • 使用众所周知的颜色之一(作为字符串或通过KnownColor枚举)表示Windows主题元素或系统颜色
  • 使用组件的整数值。

还有什么,你需要自己解析数据并提取颜色的A,R,G和B组件。在你的情况下,你可能想要提取[]内部的内容,将它们拆分为,,然后使用Int32.Parse()来读取各个值。假设字符串总是采用相同的格式,如下所示:

var elements = color.Substring(7, color.Length - 8) 
    .Split(',') 
    .Select(x => x.Split('=')) 
    .ToDictionary(x => x[0].Trim(), x => x[1].Trim()); 

var components = new int[] 
{ 
    int.Parse(elements["A"]), 
    int.Parse(elements["R"]), 
    int.Parse(elements["G"]), 
    int.Parse(elements["B"]) 
}; 

var newColor = Color.FromArgb(components[0], components[1], components[2], components[3]); 

当然,有适当的错误检查等。

2

同意@迈克尔Edenfield,只是提出一个小的改进自己的代码:

var elements = color.Substring(7, color.Length - 8) 
      .Split(',') 
      .Select(x => x.Split('=')) 
      .ToDictionary(x => x[0].Trim(), x => int.Parse(x[1])); 

var newColor = Color.FromArgb(elements["A"], elements["R"], elements["G"], elements["B"]); 
1

您可以使用String.SubstringString.IndexOf方法也提取您的信息。只要您的数据具有某种可预测的格式,它就会工作。

char[] trimChars = new char[] { ',', ' ' }; 
byte A, R, G, B; 
string color = @"Color [A=255, R=245, G=243, B=244]"; 

byte.TryParse((color.Substring(color.IndexOf('A') + 2, 3)).Trim(trimChars), out A); 
byte.TryParse((color.Substring(color.IndexOf('R') + 2, 3)).Trim(trimChars), out R); 
byte.TryParse((color.Substring(color.IndexOf('G') + 2, 3)).Trim(trimChars), out G); 
byte.TryParse((color.Substring(color.IndexOf('B') + 2, 3)).Trim(trimChars), out B); 

Color newColor = Color.FromArgb(A,R,G,B);