пытаясь преобразовать rgb из цвета .net в строку, такую ​​как «красный» или «синий» - PullRequest
8 голосов
/ 14 декабря 2008

Все мои методы подводят меня по-разному. иное освещение может испортить все это.

Кто-нибудь пытался вернуть имя, указанное в значении rgb? «красного», «зеленого», «синего» было бы достаточно для удовлетворения моих потребностей на сегодня.

У меня небезопасная обработка изображений с моей веб-камеры.

webcam

colors

Ответы [ 5 ]

5 голосов
/ 14 декабря 2008

Если у вас есть список известных цветов с именами, вы можете увидеть, к какому из этих известных цветов данный целевой цвет «ближе всего», используя функцию «близости» по линиям (код F #):

let Diff (c1:Color) (c2:Color) =
    let dr = (c1.R - c2.R) |> int
    let dg = (c1.G - c2.G) |> int
    let db = (c1.B - c2.B) |> int
    dr*dr + dg*dg + db*db

В зависимости от того, какой из известных цветов имеет наименьшее отличие от целевого цвета, который вы хотите назвать, используйте это имя.

3 голосов
/ 10 октября 2012

Вы можете попробовать этот код

static char[] hexDigits = {
         '0', '1', '2', '3', '4', '5', '6', '7',
         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};



public static string ColorToHexString(Color color)
        {
            byte[] bytes = new byte[4];
            bytes[0] = color.A;
            bytes[1] = color.R;
            bytes[2] = color.G;
            bytes[3] = color.B;
            char[] chars = new char[bytes.Length * 2];
            for (int i = 0; i < bytes.Length; i++)
            {
                int b = bytes[i];
                chars[i * 2] = hexDigits[b >> 4];
                chars[i * 2 + 1] = hexDigits[b & 0xF];
            }
            return new string(chars);
        }
2 голосов
/ 14 декабря 2008

Лично я считаю более естественным думать о цветах с точки зрения оттенок / насыщенность / яркость , чем значения RGB, и я думаю, что в этом случае это будет хорошо для вас. Попробуйте это:

Присвойте названия цветов определенным диапазонам спектра, как считаете нужным. Например, может быть, красный 0-39, оранжевый 40-79 и т. Д. (Это произвольные числа - я понятия не имею, подходят ли они к какому-либо масштабу или нет). Затем рассчитайте оттенок по вашему значению RGB (вы можете найти формулу здесь , хотя могут быть и другие). Как только вы узнаете оттенок, вы узнаете, в каком диапазоне спектра он находится, и можете дать ему имя.

0 голосов
/ 25 августа 2016

Вот простая схема имени, использующая два квалификатора и имя цвета:

string ColorName(Color c)
{
    List<float> hues = new List<float>()
    { 0, 15, 35, 44, 54, 63, 80, 160, 180, 200, 244, 280, 350, 360};
    List<string> hueNames = new List<string>()
        { "red", "orange-red", "orange", "yellow-orange", "yellow",
          "yellow-green",   "green"  , "blue-green" , "cyan", "blue", 
          "violet", "purple", "red" };

    float h = c.GetHue();
    float s = c.GetSaturation();
    float b = (c.R * 0.299f + c.G * 0.587f + c.B *0.114f) / 256f;

    string name = s < 0.35f ? "pale " : s > 0.8f ? "vivid " : "";
    name += b < 0.35f ? "dark " : b > 0.8f ? "light " : "";
    for (int i = 0; i < hues.Count - 1; i++)
        if (h >= hues[i] && h <= hues[i+1] )
        {
            name += hueNames[i];
            break;
        }
    return name;
}

Вы можете легко адаптировать его, если хотите, чтобы блюз был более дифференцированным и т. Д.

0 голосов
/ 14 декабря 2008

Ну, красный / зеленый / синий довольно легко определить путем осмотра; какой диапазон значений вам нужно поддерживать?

Проблема в том, что если вы не начнете с именованного цвета, очень трудно вернуть обратно к одному; IsNamedColor вернет false, даже если вы создадите очевидный цвет через FromArgb.

Если вам нужны только фактические ожидаемые стандартные цвета, вы можете перечислить известные цвета с помощью отражения?

        Color test = Color.FromArgb(255,0,0);
        Color known = (
                   from prop in typeof(Color)
                       .GetProperties(BindingFlags.Public | BindingFlags.Static)
                   where prop.PropertyType == typeof(Color)
                   let color = (Color)prop.GetValue(null, null)
                   where color.A == test.A && color.R == test.R
                     && color.G == test.G && color.B == test.B
                   select color)
                   .FirstOrDefault();

        Console.WriteLine(known.Name);

Возможно, вы также сможете использовать этот подход в качестве источника известных цветов для более сложного алгоритма.

...