2011-11-01 18 views

Respuesta

5

resuelto por mí:

public static double CalculateAverageLightness(Bitmap bm) 
    { 
     double lum = 0; 
     var tmpBmp = new Bitmap(bm); 
     var width = bm.Width; 
     var height = bm.Height; 
     var bppModifier = bm.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4; 

     var srcData = tmpBmp.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadOnly, bm.PixelFormat); 
     var stride = srcData.Stride; 
     var scan0 = srcData.Scan0; 

     //Luminance (standard, objective): (0.2126*R) + (0.7152*G) + (0.0722*B) 
     //Luminance (perceived option 1): (0.299*R + 0.587*G + 0.114*B) 
     //Luminance (perceived option 2, slower to calculate): sqrt(0.241*R^2 + 0.691*G^2 + 0.068*B^2) 

     unsafe 
     { 
      byte* p = (byte*)(void*)scan0; 

      for (int y = 0; y < height; y++) 
      { 
       for (int x = 0; x < width; x++) 
       { 
        int idx = (y * stride) + x * bppModifier; 
        lum += (0.299*p[idx + 2] + 0.587*p[idx + 1] + 0.114*p[idx]); 
       } 
      } 
     } 

     tmpBmp.UnlockBits(srcData); 
     tmpBmp.Dispose(); 
     var avgLum = lum/(width * height); 


     return avgLum/255.0; 
    } 
+0

¿Por -1 voto, que lo lanzó? ¡El código funciona bien! –

+0

¿Por qué necesita crear 'tmpBmp' y no usar' bm' para bloquear bits directamente en él? – sergtk

+0

¿Por qué divide el promedio por 255 al final? @ 12 – TheCoolFrood

2

creo que todo lo que puede hacer es medir cada píxel de la imagen y tomar un promedio. Si eso es demasiado lento para sus propósitos, le sugiero que tome una muestra de píxeles distribuida uniformemente y la use para calcular un promedio. También podría limitar los píxeles al área donde necesita dibujar el texto.

Puede cargar la imagen como mapa de bits (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx) y usar el método GetPixel para obtener realmente los valores de color.

Cómo evalúa el brillo depende totalmente de usted. Yo sugeriría que un enfoque más simple (digamos solo tomar el valor de color más alto) en realidad podría ser mejor ya que algunos usuarios percibirán el color de manera diferente a la norma humana (daltonismo, etc.).

Cuestiones relacionadas