2011-03-05 25 views
11

Estoy desarrollando una barra de tareas para la 2da pantalla (algo así como displayfusion).obtener color promedio de bmp

Sin embargo, tengo dificultades para obtener el color correcto del icono. Por ejemplo, Google Chrome/Cuando lo coloco sobre la barra de tareas principal, el fondo se vuelve amarillo. Con mi código, se vuelve naranja/rojo.

Esto es lo que se ve ahora:

enter image description here

¿Cómo puedo obtener el color dominante/media verdad?

que utiliza este código para calcular el promedio de color:

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

Aquí es una pregunta similar: http://stackoverflow.com/questions/5823854/how-can-i-generate-a-palette-of-prominent -colors-from-an-image/5824104 # 5824104 –

Respuesta

13

El color medio no es necesariamente siempre el color más utilizado. Recomiendo calcular el HUE de los píxeles que tienen saturación sobre un cierto umbral, y usar una matriz para crear un histograma de la imagen. (Cuántas veces se usó un cierto valor de matiz).

Luego suavice el histograma (calcule los valores medios locales con ambos vecinos), luego obtenga el lugar donde este histograma suavizado toma el valor máximo.

Puede obtener los valores HSL con:

Color.GetHue 
Color.GetSaturation 
Color.GetBrightness 
+0

Brillante, gracias! –

+2

Hace unos días puse este algoritmo en GitHub: https://github.com/jellever/DominantColor –