2011-11-01 20 views

cevap

5

bana göre çözüldü: dökü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

Neden -1 oyu? Kod iyi çalışıyor! –

+0

Neden 'tmpBmp' oluşturmalı ve bitleri doğrudan kilitlemek için bm'yi kullanmamalısınız? – sergtk

+0

Niçin avg'ı sonunda 255 ile ayırıyorsunuz? @ ʞᴉɯ – TheCoolFrood

2

Ben tüm yapabileceğiniz görüntüdeki her piksel ölçmek ve ortalamasını alın olduğunu düşünüyorum. Eğer bu amaçlarınız için çok yavaşsa, eşit olarak dağıtılmış bir piksel örneği almanızı ve bunu bir ortalama hesaplamak için kullanmanızı öneririm. Pikselleri, metni çizmeniz gereken alana da sınırlayabilirsiniz. Resmi bir Bitmap (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx) olarak yükleyebilir ve renk değerlerini almak için GetPixel yöntemini kullanabilirsiniz.

nasıl parlaklık tamamen sana kalmış olduğunu değerlendirir. Daha basit bir yaklaşımın (sadece en yüksek renk değerine sahip olduğunu söyleyebilirim), bazı kullanıcıların rengi insan normuna (renk körlüğü vb.) Farklı şekilde algılayacaklarından daha iyi olabilir.

İlgili konular