20 февраля 2014 г.

C# функция перевода цвета из HTML (W3C стандарт) в формат Color.

На днях встала задачка сконвертировать цвет из HTML формата во внутренний формат C# (System.Drawing.Color). Пытался найти не громоздкую библиотеку для манипуляции с цветом, но ничего не нашел. Принял решение написать сам то что мне нужно. Собственно итог вам и опишу, может кому пригодится:

Подключаем нужные библиотеки:
using System.Drawing;
using System.Text.RegularExpressions;
Далее код функции:
private int phs(string hexNumber) {
 hexNumber = hexNumber.Replace("x", string.Empty);
 int result = 0;
 int.TryParse(hexNumber, System.Globalization.NumberStyles.HexNumber, null, out result);
 return result;
 }
bool parseHtmlColor(String htmlColor, ref System.Drawing.Color Res) {
 System.Drawing.Color tmpColor;
 String rrr="", ggg="", bbb="", aaa=""; 
 //
 String wColor = Regex.Replace(htmlColor, @"\s", "");
 Match mtStr;
 //From #fff
 mtStr = Regex.Match(wColor, @"^#([A-Fa-f0-9]{3})$", RegexOptions.IgnoreCase);
 if (mtStr.Success) {
  tmpColor = System.Drawing.Color.FromArgb(255, phs(mtStr.Groups[1].Value.Substring(0,1)+mtStr.Groups[1].Value.Substring(0,1)), phs(mtStr.Groups[1].Value.Substring(1,1)+mtStr.Groups[1].Value.Substring(1,1)), phs(mtStr.Groups[1].Value.Substring(2,1)+mtStr.Groups[1].Value.Substring(2,1)));
  Res = tmpColor;
  return true;
  }
 //From #ffffff
 mtStr = Regex.Match(wColor, @"^#([A-Fa-f0-9]{6})$", RegexOptions.IgnoreCase);
 if (mtStr.Success) {
  tmpColor = System.Drawing.Color.FromArgb(255, phs(mtStr.Groups[1].Value.Substring(0,2)), phs(mtStr.Groups[1].Value.Substring(2,2)), phs(mtStr.Groups[1].Value.Substring(4,2)));
  Res = tmpColor;
  return true;
  }
 //From #ffffffaa with alpha chanel
 mtStr = Regex.Match(wColor, @"^#([A-Fa-f0-9]{8})$", RegexOptions.IgnoreCase);
 if (mtStr.Success) {
  tmpColor = System.Drawing.Color.FromArgb(phs(mtStr.Groups[1].Value.Substring(6,2)), phs(mtStr.Groups[1].Value.Substring(0,2)), phs(mtStr.Groups[1].Value.Substring(2,2)), phs(mtStr.Groups[1].Value.Substring(4,2)));
  Res = tmpColor;
  return true;
  }
 //From rgb(150,50%,0%)
 mtStr = Regex.Match(wColor, @"^rgb\((\d{1,3}%?)\,(\d{1,3}%?)\,(\d{1,3}%?)\)$", RegexOptions.IgnoreCase);
 if (mtStr.Success) {
  rrr = mtStr.Groups[1].Value;
  ggg = mtStr.Groups[2].Value;
  bbb = mtStr.Groups[3].Value;
  int rval = 0, gval = 0, bval = 0;
  if (rrr.Substring(rrr.Length-1,1) == "%") {
   rrr = Regex.Replace(rrr, @"%", "");
   rval = Convert.ToInt32(rrr);
   if (rval < 0) rval = 0;
   if (rval > 100) rval = 100;
   rval = (int) ((rval * 255) / 100);
   }
  else {
   rval = Convert.ToInt32(rrr);
   }
  if (ggg.Substring(ggg.Length-1,1) == "%") {
   ggg = Regex.Replace(ggg, @"%", "");
   gval = Convert.ToInt32(ggg);
   if (gval < 0) gval = 0;
   if (gval > 100) gval = 100;
   gval = (int) ((gval * 255) / 100);
   }
  else {
   gval = Convert.ToInt32(ggg);
   }
  if (bbb.Substring(bbb.Length-1,1) == "%") {
   bbb = Regex.Replace(bbb, @"%", "");
   bval = Convert.ToInt32(bbb);
   if (bval < 0) bval = 0;
   if (bval > 100) bval = 100;
   bval = (int) ((bval * 255) / 100);
   }
  else {
   bval = Convert.ToInt32(bbb);
   }
  tmpColor = System.Drawing.Color.FromArgb(255, rval, gval, bval);
  Res = tmpColor;
  return true;
  }
 //From rgba(150,50%,0%,0.5)            
 mtStr = Regex.Match(wColor, @"^rgba\((\d{1,3}%?)\,(\d{1,3}%?)\,(\d{1,3}%?),(-?[0-1]+(\.\d{0,})?)\)$", RegexOptions.IgnoreCase);
 if (mtStr.Success) {
  rrr = mtStr.Groups[1].Value;
  ggg = mtStr.Groups[2].Value;
  bbb = mtStr.Groups[3].Value;
  aaa = mtStr.Groups[4].Value;
  int rval = 0, gval = 0, bval = 0;
  double aval = 0;
  if (rrr.Substring(rrr.Length-1,1) == "%") {
   rrr = Regex.Replace(rrr, @"%", "");
   rval = Convert.ToInt32(rrr);
   if (rval < 0) rval = 0;
   if (rval > 100) rval = 100;
   rval = (int) ((rval * 255) / 100);
   }
  else {
   rval = Convert.ToInt32(rrr);
   }
  if (ggg.Substring(ggg.Length-1,1) == "%") {
   ggg = Regex.Replace(ggg, @"%", "");
   gval = Convert.ToInt32(ggg);
   if (gval < 0) gval = 0;
   if (gval > 100) gval = 100;
   gval = (int) ((gval * 255) / 100);
   }
  else {
   gval = Convert.ToInt32(ggg);
   }
  if (bbb.Substring(bbb.Length-1,1) == "%") {
   bbb = Regex.Replace(bbb, @"%", "");
   bval = Convert.ToInt32(bbb);
   if (bval < 0) bval = 0;
   if (bval > 100) bval = 100;
   bval = (int) ((bval * 255) / 100);
   }
  else {
   bval = Convert.ToInt32(bbb);
   } 
 
  aaa = Regex.Replace(aaa, @"\.", ",");                    
  aval = Convert.ToDouble(aaa);
  if (aval < 0) aval = 0;
  if (aval > 1) aval = 1;                
  tmpColor = System.Drawing.Color.FromArgb((int)(aval * 255), rval, gval, bval);
  Res = tmpColor;
  return true;
  }
 //
 mtStr = Regex.Match(wColor, @"^(\w+)$", RegexOptions.IgnoreCase);
 if (mtStr.Success) {
  switch (mtStr.Groups[1].Value) {
  case "aliceblue": Res = System.Drawing.Color.FromArgb(255, 240,248,255); return true;
  case "antiquewhite": Res = System.Drawing.Color.FromArgb(255, 250,235,215); return true;
  case "aqua": Res = System.Drawing.Color.FromArgb(255, 0,255,255); return true;
  case "aquamarine": Res = System.Drawing.Color.FromArgb(255, 127,255,212); return true;
  case "azure": Res = System.Drawing.Color.FromArgb(255, 240,255,255); return true;
  case "beige": Res = System.Drawing.Color.FromArgb(255, 245,245,220); return true;
  case "bisque": Res = System.Drawing.Color.FromArgb(255, 255,228,196); return true;
  case "black": Res = System.Drawing.Color.FromArgb(255, 0,0,0); return true;
  case "blanchedalmond": Res = System.Drawing.Color.FromArgb(255, 255,235,205); return true;
  case "blue": Res = System.Drawing.Color.FromArgb(255, 0,0,255); return true;
  case "blueviolet": Res = System.Drawing.Color.FromArgb(255, 138,43,226); return true;
  case "brown": Res = System.Drawing.Color.FromArgb(255, 165,42,42); return true;
  case "burlywood": Res = System.Drawing.Color.FromArgb(255, 222,184,135); return true;
  case "cadetblue": Res = System.Drawing.Color.FromArgb(255, 95,158,160); return true;
  case "chartreuse": Res = System.Drawing.Color.FromArgb(255, 127,255,0); return true;
  case "chocolate": Res = System.Drawing.Color.FromArgb(255, 210,105,30); return true;
  case "coral": Res = System.Drawing.Color.FromArgb(255, 255,127,80); return true;
  case "cornflowerblue": Res = System.Drawing.Color.FromArgb(255, 100,149,237); return true;
  case "cornsilk": Res = System.Drawing.Color.FromArgb(255, 255,248,220); return true;
  case "crimson": Res = System.Drawing.Color.FromArgb(255, 220,20,60); return true;
  case "cyan": Res = System.Drawing.Color.FromArgb(255, 0,255,255); return true;
  case "darkblue": Res = System.Drawing.Color.FromArgb(255, 0,0,139); return true;
  case "darkcyan": Res = System.Drawing.Color.FromArgb(255, 0,139,139); return true;
  case "darkgoldenrod": Res = System.Drawing.Color.FromArgb(255, 184,134,11); return true;
  case "darkgray": Res = System.Drawing.Color.FromArgb(255, 169,169,169); return true;
  case "darkgreen": Res = System.Drawing.Color.FromArgb(255, 0,100,0); return true;
  case "darkgrey": Res = System.Drawing.Color.FromArgb(255, 169,169,169); return true;
  case "darkkhaki": Res = System.Drawing.Color.FromArgb(255, 189,183,107); return true;
  case "darkmagenta": Res = System.Drawing.Color.FromArgb(255, 139,0,139); return true;
  case "darkolivegreen": Res = System.Drawing.Color.FromArgb(255, 85,107,47); return true;
  case "darkorange": Res = System.Drawing.Color.FromArgb(255, 255,140,0); return true;
  case "darkorchid": Res = System.Drawing.Color.FromArgb(255, 153,50,204); return true;
  case "darkred": Res = System.Drawing.Color.FromArgb(255, 139,0,0); return true;
  case "darksalmon": Res = System.Drawing.Color.FromArgb(255, 233,150,122); return true;
  case "darkseagreen": Res = System.Drawing.Color.FromArgb(255, 143,188,143); return true;
  case "darkslateblue": Res = System.Drawing.Color.FromArgb(255, 72,61,139); return true;
  case "darkslategray": Res = System.Drawing.Color.FromArgb(255, 47,79,79); return true;
  case "darkslategrey": Res = System.Drawing.Color.FromArgb(255, 47,79,79); return true;
  case "darkturquoise": Res = System.Drawing.Color.FromArgb(255, 0,206,209); return true;
  case "darkviolet": Res = System.Drawing.Color.FromArgb(255, 148,0,211); return true;
  case "deeppink": Res = System.Drawing.Color.FromArgb(255, 255,20,147); return true;
  case "deepskyblue": Res = System.Drawing.Color.FromArgb(255, 0,191,255); return true;
  case "dimgray": Res = System.Drawing.Color.FromArgb(255, 105,105,105); return true;
  case "dimgrey": Res = System.Drawing.Color.FromArgb(255, 105,105,105); return true;
  case "dodgerblue": Res = System.Drawing.Color.FromArgb(255, 30,144,255); return true;
  case "firebrick": Res = System.Drawing.Color.FromArgb(255, 178,34,34); return true;
  case "floralwhite": Res = System.Drawing.Color.FromArgb(255, 255,250,240); return true;
  case "forestgreen": Res = System.Drawing.Color.FromArgb(255, 34,139,34); return true;
  case "fuchsia": Res = System.Drawing.Color.FromArgb(255, 255,0,255); return true;
  case "gainsboro": Res = System.Drawing.Color.FromArgb(255, 220,220,220); return true;
  case "ghostwhite": Res = System.Drawing.Color.FromArgb(255, 248,248,255); return true;
  case "gold": Res = System.Drawing.Color.FromArgb(255, 255,215,0); return true;
  case "goldenrod": Res = System.Drawing.Color.FromArgb(255, 218,165,32); return true;
  case "gray": Res = System.Drawing.Color.FromArgb(255, 128,128,128); return true;
  case "green": Res = System.Drawing.Color.FromArgb(255, 0,128,0); return true;
  case "greenyellow": Res = System.Drawing.Color.FromArgb(255, 173,255,47); return true;
  case "grey": Res = System.Drawing.Color.FromArgb(255, 128,128,128); return true;
  case "honeydew": Res = System.Drawing.Color.FromArgb(255, 240,255,240); return true;
  case "hotpink": Res = System.Drawing.Color.FromArgb(255, 255,105,180); return true;
  case "indianred": Res = System.Drawing.Color.FromArgb(255, 205,92,92); return true;
  case "indigo": Res = System.Drawing.Color.FromArgb(255, 75,0,130); return true;
  case "ivory": Res = System.Drawing.Color.FromArgb(255, 255,255,240); return true;
  case "khaki": Res = System.Drawing.Color.FromArgb(255, 240,230,140); return true;
  case "lavender": Res = System.Drawing.Color.FromArgb(255, 230,230,250); return true;
  case "lavenderblush": Res = System.Drawing.Color.FromArgb(255, 255,240,245); return true;
  case "lawngreen": Res = System.Drawing.Color.FromArgb(255, 124,252,0); return true;
  case "lemonchiffon": Res = System.Drawing.Color.FromArgb(255, 255,250,205); return true;
  case "lightblue": Res = System.Drawing.Color.FromArgb(255, 173,216,230); return true;
  case "lightcoral": Res = System.Drawing.Color.FromArgb(255, 240,128,128); return true;
  case "lightcyan": Res = System.Drawing.Color.FromArgb(255, 224,255,255); return true;
  case "lightgoldenrodyellow": Res = System.Drawing.Color.FromArgb(255, 250,250,210); return true;
  case "lightgray": Res = System.Drawing.Color.FromArgb(255, 211,211,211); return true;
  case "lightgreen": Res = System.Drawing.Color.FromArgb(255, 144,238,144); return true;
  case "lightgrey": Res = System.Drawing.Color.FromArgb(255, 211,211,211); return true;
  case "lightpink": Res = System.Drawing.Color.FromArgb(255, 255,182,193); return true;
  case "lightsalmon": Res = System.Drawing.Color.FromArgb(255, 255,160,122); return true;
  case "lightseagreen": Res = System.Drawing.Color.FromArgb(255, 32,178,170); return true;
  case "lightskyblue": Res = System.Drawing.Color.FromArgb(255, 135,206,250); return true;
  case "lightslategray": Res = System.Drawing.Color.FromArgb(255, 119,136,153); return true;
  case "lightslategrey": Res = System.Drawing.Color.FromArgb(255, 119,136,153); return true;
  case "lightsteelblue": Res = System.Drawing.Color.FromArgb(255, 176,196,222); return true;
  case "lightyellow": Res = System.Drawing.Color.FromArgb(255, 255,255,224); return true;
  case "lime": Res = System.Drawing.Color.FromArgb(255, 0,255,0); return true;
  case "limegreen": Res = System.Drawing.Color.FromArgb(255, 50,205,50); return true;
  case "linen": Res = System.Drawing.Color.FromArgb(255, 250,240,230); return true;
  case "magenta": Res = System.Drawing.Color.FromArgb(255, 255,0,255); return true;
  case "maroon": Res = System.Drawing.Color.FromArgb(255, 128,0,0); return true;
  case "mediumaquamarine": Res = System.Drawing.Color.FromArgb(255, 102,205,170); return true;
  case "mediumblue": Res = System.Drawing.Color.FromArgb(255, 0,0,205); return true;
  case "mediumorchid": Res = System.Drawing.Color.FromArgb(255, 186,85,211); return true;
  case "mediumpurple": Res = System.Drawing.Color.FromArgb(255, 147,112,219); return true;
  case "mediumseagreen": Res = System.Drawing.Color.FromArgb(255, 60,179,113); return true;
  case "mediumslateblue": Res = System.Drawing.Color.FromArgb(255, 123,104,238); return true;
  case "mediumspringgreen": Res = System.Drawing.Color.FromArgb(255, 0,250,154); return true;
  case "mediumturquoise": Res = System.Drawing.Color.FromArgb(255, 72,209,204); return true;
  case "mediumvioletred": Res = System.Drawing.Color.FromArgb(255, 199,21,133); return true;
  case "midnightblue": Res = System.Drawing.Color.FromArgb(255, 25,25,112); return true;
  case "mintcream": Res = System.Drawing.Color.FromArgb(255, 245,255,250); return true;
  case "mistyrose": Res = System.Drawing.Color.FromArgb(255, 255,228,225); return true;
  case "moccasin": Res = System.Drawing.Color.FromArgb(255, 255,228,181); return true;
  case "navajowhite": Res = System.Drawing.Color.FromArgb(255, 255,222,173); return true;
  case "navy": Res = System.Drawing.Color.FromArgb(255, 0,0,128); return true;
  case "oldlace": Res = System.Drawing.Color.FromArgb(255, 253,245,230); return true;
  case "olive": Res = System.Drawing.Color.FromArgb(255, 128,128,0); return true;
  case "olivedrab": Res = System.Drawing.Color.FromArgb(255, 107,142,35); return true;
  case "orange": Res = System.Drawing.Color.FromArgb(255, 255,165,0); return true;
  case "orangered": Res = System.Drawing.Color.FromArgb(255, 255,69,0); return true;
  case "orchid": Res = System.Drawing.Color.FromArgb(255, 218,112,214); return true;
  case "palegoldenrod": Res = System.Drawing.Color.FromArgb(255, 238,232,170); return true;
  case "palegreen": Res = System.Drawing.Color.FromArgb(255, 152,251,152); return true;
  case "paleturquoise": Res = System.Drawing.Color.FromArgb(255, 175,238,238); return true;
  case "palevioletred": Res = System.Drawing.Color.FromArgb(255, 219,112,147); return true;
  case "papayawhip": Res = System.Drawing.Color.FromArgb(255, 255,239,213); return true;
  case "peachpuff": Res = System.Drawing.Color.FromArgb(255, 255,218,185); return true;
  case "peru": Res = System.Drawing.Color.FromArgb(255, 205,133,63); return true;
  case "pink": Res = System.Drawing.Color.FromArgb(255, 255,192,203); return true;
  case "plum": Res = System.Drawing.Color.FromArgb(255, 221,160,221); return true;
  case "powderblue": Res = System.Drawing.Color.FromArgb(255, 176,224,230); return true;
  case "purple": Res = System.Drawing.Color.FromArgb(255, 128,0,128); return true;
  case "red": Res = System.Drawing.Color.FromArgb(255, 255,0,0); return true;
  case "rosybrown": Res = System.Drawing.Color.FromArgb(255, 188,143,143); return true;
  case "royalblue": Res = System.Drawing.Color.FromArgb(255, 65,105,225); return true;
  case "saddlebrown": Res = System.Drawing.Color.FromArgb(255, 139,69,19); return true;
  case "salmon": Res = System.Drawing.Color.FromArgb(255, 250,128,114); return true;
  case "sandybrown": Res = System.Drawing.Color.FromArgb(255, 244,164,96); return true;
  case "seagreen": Res = System.Drawing.Color.FromArgb(255, 46,139,87); return true;
  case "seashell": Res = System.Drawing.Color.FromArgb(255, 255,245,238); return true;
  case "sienna": Res = System.Drawing.Color.FromArgb(255, 160,82,45); return true;
  case "silver": Res = System.Drawing.Color.FromArgb(255, 192,192,192); return true;
  case "skyblue": Res = System.Drawing.Color.FromArgb(255, 135,206,235); return true;
  case "slateblue": Res = System.Drawing.Color.FromArgb(255, 106,90,205); return true;
  case "slategray": Res = System.Drawing.Color.FromArgb(255, 112,128,144); return true;
  case "slategrey": Res = System.Drawing.Color.FromArgb(255, 112,128,144); return true;
  case "snow": Res = System.Drawing.Color.FromArgb(255, 255,250,250); return true;
  case "springgreen": Res = System.Drawing.Color.FromArgb(255, 0,255,127); return true;
  case "steelblue": Res = System.Drawing.Color.FromArgb(255, 70,130,180); return true;
  case "tan": Res = System.Drawing.Color.FromArgb(255, 210,180,140); return true;
  case "teal": Res = System.Drawing.Color.FromArgb(255, 0,128,128); return true;
  case "thistle": Res = System.Drawing.Color.FromArgb(255, 216,191,216); return true;
  case "tomato": Res = System.Drawing.Color.FromArgb(255, 255,99,71); return true;
  case "turquoise": Res = System.Drawing.Color.FromArgb(255, 64,224,208); return true;
  case "violet": Res = System.Drawing.Color.FromArgb(255, 238,130,238); return true;
  case "wheat": Res = System.Drawing.Color.FromArgb(255, 245,222,179); return true;
  case "white": Res = System.Drawing.Color.FromArgb(255, 255,255,255); return true;
  case "whitesmoke": Res = System.Drawing.Color.FromArgb(255, 245,245,245); return true;
  case "yellow": Res = System.Drawing.Color.FromArgb(255, 255,255,0); return true;
  case "yellowgreen": Res = System.Drawing.Color.FromArgb(255, 154,205,50 ); return true;    
  }
  } 
 return false;
}

Все сделано довольно таки просто/влоб, но работает и замечательно! :)
Пользуйтесь на здоровье кто не хочет возится с поисками библиотек.
Есть правда и ограничения: так например тут не реализованы hsl, hsla, а также WindowsColors и inherit.

Комментариев нет: