Преобразование System.Drawing.Color в RGB и значение Hex
Используя С#, я пытался разработать следующие два. То, как я это делаю, может иметь некоторые проблемы и вам нужны ваши добрые советы. Кроме того, я не знаю, есть ли какой-либо существующий метод для этого.
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;
}
Спасибо.
Ответы
Ответ 1
Я не вижу здесь проблемы. Код выглядит хорошо для меня.
Единственное, о чем я могу думать, это то, что блоки try/catch являются избыточными. Цвет - это структура, а R, G и B - это байты, поэтому c не может быть null и c.R.ToString()
, c.G.ToString()
, и c.B.ToString()
не может на самом деле не работать (единственный способ, которым я вижу, что они не работают, - это NullReferenceException
, и ни один из них не может быть фактически нулевым).
Вы можете очистить все это, используя следующее:
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() + ")";
}
Ответ 2
Вы можете сохранить его простым и использовать собственный транслятор цвета:
Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);
Затем разделите три цветовые пары на целую форму:
int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);
Ответ 3
Если вы можете использовать С# 6, вы можете воспользоваться Интерполированными строками и переписать решение @Ari Roth следующим образом:
С# 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
, чтобы использовать их в качестве методов расширения.
- Мы можем использовать ключевое слово type
string
вместо имени класса.
- Мы можем использовать лямбда-синтаксис.
- Я переименую их, чтобы они были более явными на мой вкус.
Ответ 4
например.
ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))
Это может избежать трюка KnownColor.
Ответ 5
Я нашел метод расширения, который работает довольно хорошо
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"));
}
Ссылка: https://social.msdn.microsoft.com/Forums/en-US/4c77ba6c-6659-4a46-920a-7261dd4a15d0/how-to-convert-rgba-value-into-its-equivalent-hex-code?forum=winappswithcsharp
Ответ 6
Для шестнадцатеричного кода попробуйте это
- Получить представление ARGB (альфа, красный, зеленый, синий) для цвета
- Отфильтровать альфа-канал:
& 0x00FFFFFF
- Отформатируйте значение (как шестнадцатеричное "X6" для hex)
Для 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);
}