На днях встала задачка сконвертировать цвет из HTML формата во внутренний формат C# (System.Drawing.Color). Пытался найти не громоздкую библиотеку для манипуляции с цветом, но ничего не нашел. Принял решение написать сам то что мне нужно.
Собственно итог вам и опишу, может кому пригодится:
Подключаем нужные библиотеки:
Все сделано довольно таки просто/влоб, но работает и замечательно! :)
Пользуйтесь на здоровье кто не хочет возится с поисками библиотек.
Есть правда и ограничения: так например тут не реализованы hsl, hsla, а также WindowsColors и inherit.
Подключаем нужные библиотеки:
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.
Комментариев нет:
Отправить комментарий