【发布时间】:2012-01-12 09:59:29
【问题描述】:
如果它们是人类可读格式,我想将 Color 存储在字符串中,如果不是,我想将它们存储在 ToArgb() 中。
颜色为红色,然后将其存储在“红色”字符串中,如果颜色是绿色的某种变体,则将其存储为“ff40ff80”。
在运行时我想将此字符串转换回颜色类对象?
【问题讨论】:
如果它们是人类可读格式,我想将 Color 存储在字符串中,如果不是,我想将它们存储在 ToArgb() 中。
颜色为红色,然后将其存储在“红色”字符串中,如果颜色是绿色的某种变体,则将其存储为“ff40ff80”。
在运行时我想将此字符串转换回颜色类对象?
【问题讨论】:
Color color = Color.Red;
string colorName = color.Name; // this gives you the ability to switch back to Color through Color.FromName()
Color sameColor = Color.FromName(colorName);
【讨论】:
你很幸运。 Color.ToString() 方法将为您执行此操作:
返回值
输入:
System.String如果该颜色是使用
FromName方法或FromKnownColor方法从预定义颜色创建的,则该颜色的名称为字符串;否则,一个由 ARGB 组件名称及其值组成的字符串。
【讨论】:
System.String 解析回System.Drawing.Color 可以使用System.Drawing.ColorTranslator.FromHtml 完成(不需要使用.ToString() 你也可以使用System.Drawing.ColorTranslator.ToHtml)
就像 Cody Gray 已经说过的,从颜色中获取信息非常简单。问题是让它恢复颜色。
所以也许这会给你一些起点。它没有经过测试,但您是否应该就如何解决它提供一些想法。
public Color FromString(string name)
{
if(String.IsNullOrWhitespace(name))
{
throw new ArgumentException("name");
}
KnownColor knownColor;
if(Enum.TryParse(name, out knownColor))
{
return Color.FromKnownColor(knownColor);
}
return ColorTranslator.FromHtml(name);
}
我只记得有几个问题,取决于颜色是如何写成字符串的。对于每个在框架中都存在一些类,但它们在命名空间周围被分割(如ColorTranslator)。
请注意,如果您只是调用 Color.FromName(Color.FromArgb(3,4,5,6).ToString()),您会得到一个带有名称的颜色,但 argb 值全为零!
【讨论】:
我发现提到的解决方案在从 Color 到 string 并返回到 Color 时效果不佳。它们取决于颜色是否是预定义的并有名称。以下代码对我有用。
从颜色到字符串:
string ConvertColorToString(Color color)
{
return Convert.ToString(color.ToArgb())
}
从字符串到颜色:
Color ConvertStringToColor(string s)
{
return Color.FromArgb(Convert.ToInt32(s))
}
通过将颜色转换为 32 位 ARGB 整数表示,颜色语义在转换过程中得以保留。
【讨论】: