Преобразование Системы.Рисунок.Цвета в RGB и HEX значения
С помощью C# я пытался разработать следующие два. То, как я это делаю, может иметь некоторые проблемы и нуждается в вашем добром совете. Кроме того, я не знаю, есть ли существующий метод, чтобы сделать то же самое.
private static String HexConverter(System.Drawing.Color c)
{
String rtn = String.Empty;
try
{
rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
}
catch (Exception ex)
{
//doing nothing
}
return rtn;
}
private static String RGBConverter(System.Drawing.Color c)
{
String rtn = String.Empty;
try
{
rtn = "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")";
}
catch (Exception ex)
{
//doing nothing
}
return rtn;
}
спасибо.
6 ответов:
Я не вижу здесь проблемы. Код выглядит хорошо для меня.
единственное, что я могу придумать, это то, что блоки try/catch избыточны-цвет-это структура, а R, G и B-байты, поэтому c не может быть null и
c.R.ToString()
,c.G.ToString()
иc.B.ToString()
на самом деле не может потерпеть неудачу (единственный способ, которым я могу видеть, что они терпят неудачу, - этоNullReferenceException
, и ни один из них на самом деле не может быть null).вы можете очистить все это, используя следующее:
private static String HexConverter(System.Drawing.Color c) { return "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2"); } private static String RGBConverter(System.Drawing.Color c) { return "RGB(" + c.R.ToString() + "," + c.G.ToString() + "," + c.B.ToString() + ")"; }
Вы можете сохранить его простым и использовать родной переводчик цвета:
Color red = ColorTranslator.FromHtml("#FF0000"); string redHex = ColorTranslator.ToHtml(red);
затем разбейте три пары цветов на целочисленные формы:
int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Если вы можете использовать C#6, Вы можете воспользоваться Интерполируемой Строки и переписать @ решение Ари рота такой:
C# 6:
public static class ColorConverterExtensions { public static string ToHexString(this Color c) => $"#{c.R:X2}{c.G:X2}{c.B:X2}"; public static string ToRgbString(this Color c) => $"RGB({c.R}, {c.G}, {c.B})"; }
также:
- я добавляю ключевое слово
this
использовать их в качестве методов расширений.- вы можете использовать ключевое слово типа
string
вместо имени класса.- вы можете использовать лямбда-синтаксис
- я переименовываю их, чтобы быть более явным для моего вкус.
например
ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))
Это может избежать известного трюка цвета.
Я нашел метод расширения, который работает довольно хорошо
public static string ToHex(this Color color) { return String.Format("#{0}{1}{2}{3}" , color.A.ToString("X").Length == 1 ? String.Format("0{0}", color.A.ToString("X")) : color.A.ToString("X") , color.R.ToString("X").Length == 1 ? String.Format("0{0}", color.R.ToString("X")) : color.R.ToString("X") , color.G.ToString("X").Length == 1 ? String.Format("0{0}", color.G.ToString("X")) : color.G.ToString("X") , color.B.ToString("X").Length == 1 ? String.Format("0{0}", color.B.ToString("X")) : color.B.ToString("X")); }
для шестнадцатеричного кода попробуйте это
- Get ARGB (Альфа, красный, зеленый, синий) представление для цвета
- фильтр Альфа-канал:
& 0x00FFFFFF
- отформатируйте значение (как шестнадцатеричное " X6 " для шестнадцатеричного)
для RGB one
- просто из
Red
,Green
,Blue
значенияреализация
private static string HexConverter(Color c) { return String.Format("#{0:X6}", c.ToArgb() & 0x00FFFFFF); } public static string RgbConverter(Color c) { return String.Format("RGB({0},{1},{2})", c.R, c.G, c.B); }