2011-03-05 109 views
11

我正在開發第二個屏幕的任務欄(類似於displayfusion)。從bmp獲取平均顏色

但是,我很難從圖標中獲得正確的平均顏色。例如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); 
} 
+0

這是一個類似的問題:http://stackoverflow.com/questions/5823854/how-can-i-generate-a-palette-of-prominent -colors-from-an-image/5824104#5824104 – 2011-07-19 15:01:11

回答

13

平均顏色不neccessarily最常用的顏色。我建議計算飽和度超過一定閾值的像素的HUE,並使用數組創建圖像的直方圖。 (使用某種色調值的次數)。

然後對直方圖進行平滑(用兩個鄰居計算局部平均值),然後獲取平滑後的直方圖取最大值的位置。

你可以得到HSL值:

Color.GetHue 
Color.GetSaturation 
Color.GetBrightness 
+0

輝煌,謝謝! – 2011-03-05 20:51:35

+2

前幾天我實際上把這個算法放在GitHub上:https://github.com/jellever/DominantColor – 2016-01-03 10:09:47