На днях встала задачка сконвертировать цвет из 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.
Комментариев нет:
Отправить комментарий