2011-11-01 14 views

Odpowiedz

5

Zrobione przeze mnie:

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

Dlaczego -1 głos, który go rzucić? Kod działa poprawnie! –

+0

Dlaczego musisz utworzyć 'tmpBmp' i nie używać' bm' do blokowania bitów bezpośrednio w nim? – sergtk

+0

Dlaczego dzielisz średnią na 255? @ ʞᴉɯ – TheCoolFrood

2

myślę wszystko, co można zrobić, to zmierzyć każdy piksel w obrazie i wziąć średnią. Jeśli jest to zbyt wolne dla twoich celów, sugerowałbym wzięcie równomiernie rozłożonej próbki pikseli i użycie jej do obliczenia średniej. Możesz także ograniczyć piksele do obszaru, w którym musisz narysować tekst.

Możesz załadować obraz jako bitmapę (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx) i użyć metody GetPixel, aby uzyskać wartości kolorów.

Sposób oceny jasności zależy wyłącznie od Ciebie. Sugerowałbym prostsze podejście (powiedzmy, że przyjmując najwyższą wartość koloru) może faktycznie być lepsze, ponieważ niektórzy użytkownicy będą postrzegać kolor inaczej niż ludzka norma (ślepota kolorów itp.).