C# ColorTranslator.FromHtml() 为 "Grey" 抛出异常(不是 int32 的有效值)
C# ColorTranslator.FromHtml() throws Exception for "Grey" (is not a valid value for int32)
我正在我的应用程序中使用 Microsoft Cognitive Services / Vision API。
Vision API returns 颜色字符串 - 十六进制(不带“#”前缀)或名称。
为了将其转换为我可以用作面板背景颜色的 System.Drawing.Color,我使用以下代码:
// Hex Color Format
Regex hex = new Regex("^#(?:[0-9a-fA-F]{3}){1,2}$");
// Colours
System.Drawing.Color accent = new System.Drawing.Color();
System.Drawing.Color fore = new System.Drawing.Color();
System.Drawing.Color back = new System.Drawing.Color();
try
{
if (hex.IsMatch("#" + result.Color.AccentColor.ToString())) accent = ColorTranslator.FromHtml("#" + result.Color.AccentColor.ToString());
else accent = ColorTranslator.FromHtml(result.Color.AccentColor.ToString());
fore = ColorTranslator.FromHtml(result.Color.DominantColorForeground.ToString());
back = ColorTranslator.FromHtml(result.Color.DominantColorBackground.ToString());
displayData.Colors = new System.Drawing.Color[] { accent, fore, back };
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
这在 99% 的情况下工作正常,但是,当来自 Micrsoft Vision API 的一种颜色 returns 与 "Grey", 我得到一个例外:
Grey is not a valid value for Int32
(这是我遇到的唯一一个颜色名称,但我不知道是否还有其他颜色名称)
根据我的理解,这是因为 "Grey" 不是 HTML 颜色名称,它应该是 "Gray"("Grey" 是 CSS 姓名)
http://www.rapidtables.com/web/color/gray-color.htm
处理此异常的最佳方法是什么?我正在考虑创建一个包含 "bad" 颜色名称的字典并手动为这些颜色分配真正的 HTML 颜色名称(或直接 System.Drawing.Color),但这似乎容易出现人为错误和持续不断的游戏更新颜色。
想法?谢谢。
在抛出错误的代码周围放置一个 try/catch 块,如果异常类型与您获得的任何异常类型匹配,则处理它并调整颜色名称而不是抛出异常。
你可以这样做:
string ColorValue="your Color String";
Color col;
try
{
col = ColorTranslator.FromHtml(ColorValue);
}
catch
{
ColorValue = ColorValue.ToLower();
Array Colors=Enum.GetValues(typeof(KnownColor));
string[] names=Enum.GetNames(typeof(KnownColor));
for (int k = 0; k < Colors.Length; k++)
{
if (names.Equals(ColorValue))
{
col = Color.FromKnownColor((KnownColor)Colors.GetValue(k));
}
}
}
}
我这样做的方式可能很复杂,但我将您的所有回复合并为一个,我认为这是一个巧妙的解决方案:
我创建了一个名为 ColorFix
的新 class,它检查 Dictionary<string, string>
(手动定义)中的 "bad" 名称,然后检查它是否是 KnownName
,否则只是返回一个新的空白 Color
对象。
然后,通过调用 class,我创建了一个方法 ColorFromString
,它接受来自 Microsoft API.
的原始字符串颜色
这是尝试 ColorTranslate.FromHtml
并捕获异常的旧代码,但现在异常是通过 ColorFix
.
处理的
如此迂回的方式,只解析字典并检查它是否是已知名称。
我对 C# 比较陌生,所以如果这对任何人有帮助,这是我的代码:
Controller.cs
// Colours
System.Drawing.Color accent = new System.Drawing.Color();
System.Drawing.Color fore = new System.Drawing.Color();
System.Drawing.Color back = new System.Drawing.Color();
try
{
accent = ColorFromString(result.Color.AccentColor.ToString());
fore = ColorFromString(result.Color.DominantColorForeground.ToString());
back = ColorFromString(result.Color.DominantColorBackground.ToString());
displayData.Colors = new System.Drawing.Color[] { accent, fore, back };
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
...
private System.Drawing.Color ColorFromString(string color)
{
System.Drawing.Color value = new System.Drawing.Color();
// Hex Color Format
Regex hex = new Regex("^#(?:[0-9a-fA-F]{3}){1,2}$");
try
{
if (hex.IsMatch("#" + color)) value = ColorTranslator.FromHtml("#" + color);
else value = ColorTranslator.FromHtml(color);
}
catch (Exception)
{
ColorFix colorFix = new ColorFix(color);
value = colorFix.Fix();
}
return value;
}
ColorFix.cs
using System;
using System.Collections.Generic;
using System.Drawing;
namespace Project.Services
{
class ColorFix
{
private string color;
public Dictionary<string, string> badColors = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
//
// Constructor, takes Color String
//
// @param string(color)
// @return void
//
public ColorFix(string color)
{
this.color = color;
badColors.Add("Grey", "Gray");
}
//
// Fix the Color Exception
//
// @return Color
//
public Color Fix()
{
if (Bad() != null) return (Color)Bad();
if (Known() != null) return (Color)Known();
return new Color();
}
//
// Check if Color is a system KnownColor
//
// @return Nullable<Color>
//
private Color? Known()
{
string colorLower = color.ToLower();
Array colorValues = Enum.GetValues(typeof(KnownColor));
string[] colorNames = Enum.GetNames(typeof(KnownColor));
for (int c = 0; c < colorValues.Length; c++)
{
if (colorNames.Equals(colorLower)) return Color.FromKnownColor((KnownColor)colorValues.GetValue(c));
}
return null;
}
//
// Check if Color is within the Bad Colors Dictionary
//
// @return Nullable<Color>
//
private Color? Bad()
{
if (badColors.ContainsKey(color))
{
try
{
return ColorTranslator.FromHtml(badColors[color]);
}
catch (Exception)
{
return null;
}
}
return null;
}
}
}
我正在我的应用程序中使用 Microsoft Cognitive Services / Vision API。
Vision API returns 颜色字符串 - 十六进制(不带“#”前缀)或名称。
为了将其转换为我可以用作面板背景颜色的 System.Drawing.Color,我使用以下代码:
// Hex Color Format
Regex hex = new Regex("^#(?:[0-9a-fA-F]{3}){1,2}$");
// Colours
System.Drawing.Color accent = new System.Drawing.Color();
System.Drawing.Color fore = new System.Drawing.Color();
System.Drawing.Color back = new System.Drawing.Color();
try
{
if (hex.IsMatch("#" + result.Color.AccentColor.ToString())) accent = ColorTranslator.FromHtml("#" + result.Color.AccentColor.ToString());
else accent = ColorTranslator.FromHtml(result.Color.AccentColor.ToString());
fore = ColorTranslator.FromHtml(result.Color.DominantColorForeground.ToString());
back = ColorTranslator.FromHtml(result.Color.DominantColorBackground.ToString());
displayData.Colors = new System.Drawing.Color[] { accent, fore, back };
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
这在 99% 的情况下工作正常,但是,当来自 Micrsoft Vision API 的一种颜色 returns 与 "Grey", 我得到一个例外:
Grey is not a valid value for Int32
(这是我遇到的唯一一个颜色名称,但我不知道是否还有其他颜色名称)
根据我的理解,这是因为 "Grey" 不是 HTML 颜色名称,它应该是 "Gray"("Grey" 是 CSS 姓名) http://www.rapidtables.com/web/color/gray-color.htm
处理此异常的最佳方法是什么?我正在考虑创建一个包含 "bad" 颜色名称的字典并手动为这些颜色分配真正的 HTML 颜色名称(或直接 System.Drawing.Color),但这似乎容易出现人为错误和持续不断的游戏更新颜色。
想法?谢谢。
在抛出错误的代码周围放置一个 try/catch 块,如果异常类型与您获得的任何异常类型匹配,则处理它并调整颜色名称而不是抛出异常。
你可以这样做:
string ColorValue="your Color String";
Color col;
try
{
col = ColorTranslator.FromHtml(ColorValue);
}
catch
{
ColorValue = ColorValue.ToLower();
Array Colors=Enum.GetValues(typeof(KnownColor));
string[] names=Enum.GetNames(typeof(KnownColor));
for (int k = 0; k < Colors.Length; k++)
{
if (names.Equals(ColorValue))
{
col = Color.FromKnownColor((KnownColor)Colors.GetValue(k));
}
}
}
}
我这样做的方式可能很复杂,但我将您的所有回复合并为一个,我认为这是一个巧妙的解决方案:
我创建了一个名为 ColorFix
的新 class,它检查 Dictionary<string, string>
(手动定义)中的 "bad" 名称,然后检查它是否是 KnownName
,否则只是返回一个新的空白 Color
对象。
然后,通过调用 class,我创建了一个方法 ColorFromString
,它接受来自 Microsoft API.
这是尝试 ColorTranslate.FromHtml
并捕获异常的旧代码,但现在异常是通过 ColorFix
.
如此迂回的方式,只解析字典并检查它是否是已知名称。
我对 C# 比较陌生,所以如果这对任何人有帮助,这是我的代码:
Controller.cs
// Colours
System.Drawing.Color accent = new System.Drawing.Color();
System.Drawing.Color fore = new System.Drawing.Color();
System.Drawing.Color back = new System.Drawing.Color();
try
{
accent = ColorFromString(result.Color.AccentColor.ToString());
fore = ColorFromString(result.Color.DominantColorForeground.ToString());
back = ColorFromString(result.Color.DominantColorBackground.ToString());
displayData.Colors = new System.Drawing.Color[] { accent, fore, back };
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
...
private System.Drawing.Color ColorFromString(string color)
{
System.Drawing.Color value = new System.Drawing.Color();
// Hex Color Format
Regex hex = new Regex("^#(?:[0-9a-fA-F]{3}){1,2}$");
try
{
if (hex.IsMatch("#" + color)) value = ColorTranslator.FromHtml("#" + color);
else value = ColorTranslator.FromHtml(color);
}
catch (Exception)
{
ColorFix colorFix = new ColorFix(color);
value = colorFix.Fix();
}
return value;
}
ColorFix.cs
using System;
using System.Collections.Generic;
using System.Drawing;
namespace Project.Services
{
class ColorFix
{
private string color;
public Dictionary<string, string> badColors = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
//
// Constructor, takes Color String
//
// @param string(color)
// @return void
//
public ColorFix(string color)
{
this.color = color;
badColors.Add("Grey", "Gray");
}
//
// Fix the Color Exception
//
// @return Color
//
public Color Fix()
{
if (Bad() != null) return (Color)Bad();
if (Known() != null) return (Color)Known();
return new Color();
}
//
// Check if Color is a system KnownColor
//
// @return Nullable<Color>
//
private Color? Known()
{
string colorLower = color.ToLower();
Array colorValues = Enum.GetValues(typeof(KnownColor));
string[] colorNames = Enum.GetNames(typeof(KnownColor));
for (int c = 0; c < colorValues.Length; c++)
{
if (colorNames.Equals(colorLower)) return Color.FromKnownColor((KnownColor)colorValues.GetValue(c));
}
return null;
}
//
// Check if Color is within the Bad Colors Dictionary
//
// @return Nullable<Color>
//
private Color? Bad()
{
if (badColors.ContainsKey(color))
{
try
{
return ColorTranslator.FromHtml(badColors[color]);
}
catch (Exception)
{
return null;
}
}
return null;
}
}
}