2016-05-01 6 views
1

Я использую Microsoft Cognitive Services/Vision API в своем приложении.C# ColorTranslator.FromHtml() throws Исключение для «Серый» (неверное значение для int32)

API Vision API возвращает цвета как строку - либо HEX (без префикса «#»), либо как имя.

Для того, чтобы превратить это в 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 с «Gray», я получаю исключение:

Grey is not a valid value for Int32

(Это единственное имя, цвет я сталкивался, но я не знаю, если здесь бы другие)

От моего понимания, это будет, потому что «серый» не HTML Имя цвета, как это должно быть «Серый» («Серый» быть имя CSS) http://www.rapidtables.com/web/color/gray-color.htm

Что бы быть лучшим способом справиться с этим Исключением? Я думал о создании словаря «плохих» имен цветов и вручную назначил этим цветам их истинное имя цвета HTML (или непосредственно System.Drawing.Color), но это, похоже, подвержено человеческой ошибке и постоянной игре обновления Color.

Мысли? Благодарю.

+2

Как уже упоминалось, 99% случаев работают. Так что сделайте небольшой «жесткий код» для плохих имен цветов в порядке. P.S., Gray and Grey _both correct_, один - американский, другой - британский. – kennyzx

+0

Спасибо! Да, я думал, что это будет самое простое решение, но не понравилось, как бесполезно это получить LOL :) Решение KISS это! (если кто-то не может предоставить опцию опрятного;)) –

ответ

0

Я, вероятно, сделал это в свернутой форме, но я слиты все ваши ответы в один, и я думаю, что это было изящное решение:

I создайте новый класс под названием ColorFix, который проверяет «плохие» имена в Dictionary<string, string> (вручную), а затем проверяет, является ли он KnownName, иначе иначе просто будет возвращен новый пустой объект Color.

Затем из вызывающего класса я создал метод ColorFromString, который принимает цвет исходной строки из API Microsoft.

Это старый код, который пытается 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; 
     } 
    } 
} 
1

Поместите блок try/catch вокруг кода, который выдает ошибку, и если тип исключения совпадает с типом исключения, который вы получаете, обработайте его и настройте имя цвета вместо того, чтобы выбрасывать исключение.

+0

Я точно знаю, что такое Исключение (я думаю) - в том, что «Серый» не является цветовым именем HTML, но я собирался использовать этот метод для создания резервной копии цвета , или окончательную ручную функцию преобразования. Благодаря! –

+0

Я просто посмотрел на MSDN и вижу, что он даже не выбрасывает определенный тип исключения. Звучит как жесткое кодирование, это будет путь наименьшего сопротивления. –

+0

Да, это просто плохая строка, поэтому никакого конкретного типа :( –

2

Вы можете сделать так:

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


       } 
      } 
     } 
+0

К сожалению, «Серый» не является известным, поскольку «Серый» - это известное правописание, но спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^