2013-11-17 5 views
0

Я создаю объект Bitmap с того же изображения, но в конце получаю разные результаты. Он должен рассчитать отклонение от цветов изображения, а изображения одинаковы, так почему результаты разные?Получение другого растрового объекта из того же файла изображения

double test1 = GetStdDev("C:\\temp\\images\\file.jpg"); 
Bitmap img = new Bitmap("C:\\temp\\images\\file.jpg"); 
double test2 = GetStdDev(img); 

public static double GetStdDev(string imageFileName) 
{ 
     double total = 0, totalVariance = 0; 
     int count = 0; 
     double stdDev = 0; 

     // First get all the bytes 
     using (Bitmap b = new Bitmap(imageFileName)) 
     { 
      BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, b.PixelFormat); 
      int stride = bmData.Stride; 
      IntPtr Scan0 = bmData.Scan0; 
      unsafe 
      { 
       byte* p = (byte*)(void*)Scan0; 
       int nOffset = stride - b.Width * 3; 
       for (int y = 0; y < b.Height; ++y) 
       { 
        for (int x = 0; x < b.Width; ++x) 
        { 
         count++; 

         byte blue = p[0]; 
         byte green = p[1]; 
         byte red = p[2]; 

         int pixelValue = Color.FromArgb(0, red, green, blue).ToArgb(); 
         total += pixelValue; 
         double avg = total/count; 
         totalVariance += Math.Pow(pixelValue - avg, 2); 
         stdDev = Math.Sqrt(totalVariance/count); 

         p += 3; 
        } 
        p += nOffset; 
       } 
      } 

      b.UnlockBits(bmData); 
     } 

     return stdDev; 
    } 

private static double GetStdDev(Bitmap img) 
{ 
     double total = 0, totalVariance = 0; 
     int count = 0; 
     double stdDev = 0; 

     // First get all the bytes 
     using (Bitmap b = new Bitmap(img)) 
     { 
      BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, b.PixelFormat); 
      int stride = bmData.Stride; 
      IntPtr Scan0 = bmData.Scan0; 
      unsafe 
      { 
       byte* p = (byte*)(void*)Scan0; 
       int nOffset = stride - b.Width * 3; 
       for (int y = 0; y < b.Height; ++y) 
       { 
        for (int x = 0; x < b.Width; ++x) 
        { 
         count++; 

         byte blue = p[0]; 
         byte green = p[1]; 
         byte red = p[2]; 

         int pixelValue = Color.FromArgb(0, red, green, blue).ToArgb(); 
         total += pixelValue; 
         double avg = total/count; 
         totalVariance += Math.Pow(pixelValue - avg, 2); 
         stdDev = Math.Sqrt(totalVariance/count); 

         p += 3; 
        } 
        p += nOffset; 
       } 
      } 

      b.UnlockBits(bmData); 
     } 

     return stdDev; 
    } 
+0

** 1) ** Почему 'GetStdDev (Bitmap img)' создает новое изображение вместо того, чтобы итерации того, который он дал? ** 2) ** Почему бы не просто «GetStdDev (string imageFileName)» загрузить изображение и вызвать «GetStdDev (Bitmap img)»? – Rotem

+0

Проблема в том, что когда я вызываю GetStdDev (Bitmap img), он получает неправильный результат и не может понять, почему ... – Reno

+0

Я не знаю, почему есть разница, но я не понимаю, как любой из методов создает какие-либо значимые результат. Вы уверены, что понимаете, что возвращает 'Color.ToArgb()'? – Rotem

ответ

0

Просто найденное решение, это проблема с глубоким копированием растрового объекта. вместо использования нового Bitmap (img) используйте Bitmap img2 = (Bitmap) img.Clone(); не знаю, что это правильное решение, но он выполняет эту работу.

Смежные вопросы