получить средний цвет от BMP - PullRequest
11 голосов
/ 05 марта 2011

Я занимаюсь разработкой панели задач для второго экрана (что-то вроде displayfusion).

Однако у меня возникают трудности с получением правильного среднего цвета из значка.Например, Google Chrome / Когда я наведу его на главную панель задач, фон станет желтым.С моим кодом он становится оранжевым / красным.

Вот как это выглядит сейчас:

enter image description here

Как получить правильный доминирующий / средний цвет?

Я использую этот код для расчета среднего цвета:

public static Color getDominantColor(Bitmap bmp)
{
     //Used for tally
     int r = 0;
     int g = 0;
     int b = 0;

     int total = 0;

     for (int x = 0; x < bmp.Width; x++)
     {
          for (int y = 0; y < bmp.Height; y++)
          {
               Color clr = bmp.GetPixel(x, y);    
               r += clr.R;
               g += clr.G;
               b += clr.B;    
               total++;
          }
     }

     //Calculate average
     r /= total;
     g /= total;
     b /= total;

     return Color.FromArgb(r, g, b);
}

1 Ответ

13 голосов
/ 05 марта 2011

Средний цвет не обязательно самый используемый цвет.Я рекомендую рассчитать HUE пикселей, которые имеют насыщенность выше определенного порога, и использовать массив для создания гистограммы изображения.(Сколько раз использовалось определенное значение оттенка).

Затем сгладьте гистограмму (рассчитайте локальные средние значения с обоими соседями), затем найдите место, где сглаженная гистограмма принимает максимальное значение.* Вы можете получить значения HSL с помощью:

Color.GetHue
Color.GetSaturation
Color.GetBrightness
...