2011-11-01 3 views

Répondre

5

résolu par moi:

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

Pourquoi -1 vote, qui l'a émis? Le code fonctionne bien! –

+0

Pourquoi avez-vous besoin de créer 'tmpBmp' et de ne pas utiliser' bm' pour verrouiller les bits directement dedans? – sergtk

+0

Pourquoi divisez-vous la moyenne de 255 à la fin? @ ʞᴉɯ – TheCoolFrood

2

Je pense que tout ce que vous pouvez faire est de mesurer chaque pixel de l'image et de prendre en moyenne. Si c'est trop lent pour vos besoins, alors je suggère de prendre un échantillon de pixels uniformément répartis et en utilisant cela pour calculer une moyenne. Vous pouvez également limiter les pixels à la zone où vous devez dessiner le texte.

Vous pouvez charger l'image en tant que bitmap (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx) et utiliser la méthode GetPixel pour obtenir réellement les valeurs de couleur.

L'évaluation de la luminosité dépend entièrement de vous. Je suggérerais une approche plus simple (disons juste en prenant la plus haute valeur de couleur) qui pourrait être meilleure car certains utilisateurs percevront la couleur différemment de la norme humaine (daltonisme, etc.).

Questions connexes