2011-11-01 34 views

Trả lời

5

giải quyết bằng cách cho tôi:

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

Tại sao -1 bỏ phiếu, người đúc nó? Mã hoạt động tốt! –

+0

Tại sao bạn cần tạo 'tmpBmp' và không sử dụng' bm' để khóa bit trực tiếp trong đó? – sergtk

+0

Tại sao bạn định mức trung bình 255 vào cuối? @ ʞᴉɯ – TheCoolFrood

2

Tôi nghĩ rằng tất cả các bạn có thể làm là đo mỗi điểm ảnh trong hình ảnh và mất trung bình. Nếu đó là quá chậm cho các mục đích của bạn thì tôi sẽ đề nghị lấy một mẫu phân bố đồng đều của các điểm ảnh và sử dụng để tính trung bình. Bạn cũng có thể giới hạn các pixel đến khu vực bạn cần vẽ văn bản.

Bạn có thể tải hình ảnh dưới dạng bitmap (http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx) và sử dụng phương pháp GetPixel để thực sự nhận được các giá trị màu.

Cách bạn đánh giá độ sáng hoàn toàn tùy thuộc vào bạn. Tôi sẽ đề nghị một cách tiếp cận đơn giản hơn (chỉ cần lấy giá trị màu cao nhất) có thể thực sự tốt hơn vì một số người dùng sẽ cảm nhận màu sắc khác nhau theo tiêu chuẩn của con người (mù màu vv).

Các vấn đề liên quan