Преобразование Системы.Рисунок.Цвета в 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 98

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"));
}

Ref: 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

для шестнадцатеричного кода попробуйте это

  1. Get ARGB (Альфа, красный, зеленый, синий) представление для цвета
  2. фильтр Альфа-канал: & 0x00FFFFFF
  3. отформатируйте значение (как шестнадцатеричное " X6 " для шестнадцатеричного)

для RGB one

  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);
}