Перетворити System.Drawing.Color в RGB і Hex Value


125

За допомогою 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;
}

Дякую.


Відповіді:


202

Я не бачу тут проблеми. Код мені добре виглядає.

Єдине , що я можу думати про те , що Try / уловах блоки є надлишковими - колір є структурою і R, G, B і байти, так що з не може бути порожнім і 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() + ")";
}

1
Я б пішов так далеко, щоб сказати, що порожні блоки пробного лову повинні (майже) повсюдно викорінюватися. Вони мають великий потенціал призвести до баггі-коду, якщо не зараз, то вниз, коли цей код буде змінено. Все-таки +1 для очищеного коду, і OP +1 для чітко оформленого питання.
JMD

7
Зайняв час, щоб знайти еквівалент VB: String.Format ("# {0: X2} {1: X2} {2: X2}", cR, cG, cB)
zacharydl

1
Я публікую адаптацію вашого коду до C # 6 як альтернативну відповідь. Ви можете побачити тут .
aloisdg переходить на codidact.com

Це призведе до неправильного кольору, якщо колір має альфа-канал (прозорість). Ви отримаєте повну непрозорість.
LarryBud

@LarryBud Абсолютно правда, і дякую, що вказали на це. Мій приклад пропустив альфа-канал лише тому, що я відключав оригінальне запитання, яке також не включало його. :)
Арі Рот

189

Ви можете зробити це просто та використовувати рідний кольоровий перекладач:

Color red = ColorTranslator.FromHtml("#FF0000");
string redHex = ColorTranslator.ToHtml(red);

Потім розбити три пари кольорів на цілу форму:

int value = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

7
Але якщо я роблю так, колір червоний = System.Drawing.Color.Red; рядок redHex = ColorTranslator.ToHtml (червоний); він не забезпечує шістнадцяткове значення.
Назмул

Безумовно, що слід зробити, я спеціально перевірив цей код і отримав # "FF0000". Що ти отримуєш? Ви також можете посилатися на посилання MSDN: msdn.microsoft.com/en-us/library/…
Полювання на Трою

Спробуйте з кольором червоного = System.Drawing.Color.Red; -> він не надає # FF0000.
Назмул

9
Код, який ви надали, працює, але коли я змінюю перший рядок вашого коду на: Колір червоний = System.Drawing.Color.Red; -> Тоді він не дає шістнадцятковий код. Це дає "Червоний" як вихід.
Назмул

4
@Hoque - підтверджено. ColorTranslator дає "дружнє" ім'я кольору. Як надокучливо!
неділя

38

Якщо ви можете використовувати C # 6 або вище, ви можете скористатися інтерпольованими рядками та переписати рішення @Ari Roth таким чином:

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замість назви класу.
  • Ми можемо використовувати лямбда-синтаксис.
  • Я перейменую їх, щоб вони були більш явними на мій смак.

Так чисто ... +1!
Shockwaver

26

напр

 ColorTranslator.ToHtml(Color.FromArgb(Color.Tomato.ToArgb()))

Це дозволить уникнути хитрості K PoznaColor.


1

Я знайшов метод розширення, який працює досить добре

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? форум = winappswithcsharp


Я вірю, що це повинен бути Hex2, а не Hex, інакше колір може бути неправильно інтерпольований.
Мохаммед Норелдін

@MohammedNoureldin Де б Hex2 пішов у коді, я бачив, що кольори іноді трохи відрізняються?
user1

Я мав на увазі X2замість цього X, інакше ви можете отримати 1замість 01цього, це буде проблемою.
Мохаммед Нурелдін

@MohammedNoureldin Так, X2тоді вам не потрібні всі color.B.ToString("X").Length == 1 ? земляки.
ПрофК

1

Для шістнадцяткового коду спробуйте це

  1. Отримайте представлення кольорів ARGB (Альфа, Червоний, Зелений, Синій)
  2. Фільтр альфа-каналу:& 0x00FFFFFF
  3. Відформатуйте значення (як шістнадцятковий "X6" для шістнадцяткової)

Для RGB - один

  1. Просто форматувати з 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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.