【问题标题】:C# ColorTranslator.FromHtml() throws Exception for "Grey" (is not a valid value for int32)C# ColorTranslator.FromHtml() 为“灰色”抛出异常(不是 int32 的有效值)
【发布时间】:2016-08-26 07:17:38
【问题描述】:

我在我的应用程序中使用 Microsoft 认知服务/视觉 API。

Vision API 以字符串形式返回颜色 - 十六进制(不带“#”前缀)或名称。

为了将其转换为可用作面板背景颜色的 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 返回并带有 “灰色” 时,我得到一个异常:

Grey is not a valid value for Int32

(这是我遇到的唯一一个颜色名称但不知道还有没有其他的)

据我了解,这是因为“Grey”不是 HTML 颜色名称,因为它应该是“Gray”(“Grey”是 CSS 名称) http://www.rapidtables.com/web/color/gray-color.htm

处理此异常的最佳方法是什么?我正在考虑创建一个“坏”颜色名称的字典,并手动为这些颜色分配真正的 HTML 颜色名称(或直接为 System.Drawing.Color),但这似乎容易出现人为错误和不断更新颜色的游戏。

想法?谢谢。

【问题讨论】:

  • 如您所说,99% 的案例都有效。所以对不好的颜色名称做一些“硬编码”是可以的。 P.S.,Gray 和 Gray 都是正确的,一个是美国人,一个是英国人。
  • 谢谢!是的,我认为这将是最简单的解决方案,但不喜欢它会变得多么混乱,哈哈 :) KISS 解决方案! (除非有人可以提供更整洁的选择;))

标签: c# winforms exception colors vision


【解决方案1】:

你可以这样做:

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


              }
          }
        }

【讨论】:

  • 不幸的是,“Grey”不是 KnownColor,因为“Gray”是已知的拼写,但谢谢 :)
【解决方案2】:

在抛出错误的代码周围放置一个 try/catch 块,如果异常类型与您得到的任何异常类型匹配,则处理它并调整颜色名称而不是抛出异常。

【讨论】:

  • 我确切地知道异常是什么(我认为)——因为“灰色”不是 HTML 颜色名称——但我打算使用这种方法来创建后备颜色或最终颜色手动转换功能。谢谢!
  • 啊,我刚刚查看了 MSDN,发现它甚至没有抛出特定类型的异常。听起来像是硬编码,这将是阻力最小的路径。
  • 是的,它只是一个坏字符串,所以没有特定类型:(
【解决方案3】:

我可能以一种令人费解的方式这样做,但我将您的所有回复合并为一个,我认为这是一个很好的解决方案:

我创建了一个名为ColorFix 的新类,它检查Dictionary&lt;string, string&gt;(手动定义)中的“坏”名称,然后检查它是否是KnownName,否则只返回一个新的空白Color对象。

然后,从调用类中,我创建了一个方法 ColorFromString,它接受来自 Microsoft API 的原始字符串颜色。

这是尝试ColorTranslate.FromHtml 并捕获异常的旧代码——除了现在异常通过ColorFix 处理。

如此迂回的方式只是解析字典并检查它是否是 KnownName。

我对 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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多