2013-04-09 29 views
2

我正在編寫一個函數來獲取visual studio 2010中兩個位圖圖像之間的差異。我有一個函數將兩個位圖圖像作爲參數,我使用解鎖位來獲取每個像素的數據,這兩個圖像的分辨率和尺寸都是相同的。使用不安全的方法比較兩個圖像數據

當我使用的解鎖位只有一個像它工作得很好,但是當我在同一個函數使用它都同時它提供了一個例外

BITMAP地區已經鎖定

代碼

public Bitmap Invert(Bitmap b,Bitmap c) 
    { 

     BitmapData bmData = 
      b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height), 
         ImageLockMode.ReadWrite, 
         System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

     int stride = bmData.Stride; 
     System.IntPtr Scan0 = bmData.Scan0; 

     // for image 2 
     BitmapData data2 = 
      c.LockBits(new System.Drawing.Rectangle(0, 
                0, 
                c.Width, 
                c.Height), 
         ImageLockMode.ReadWrite, 
         System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

     int stride1 = data2.Stride; 
     System.IntPtr Scan1 = data2.Scan0; 
     unsafe 
     { 
      byte* p = (byte*)(void*)Scan0; 
      byte* q = (byte*)(void*)Scan1; 
      nOffset = stride - b.Width * 3; 
      nWidth = b.Width * 3; 
      for (y = 0; y < b.Height; ++y) 
      { 
       for (x = 0; x < nWidth; ++x) 
       { 
        p[0] = (byte)(p[0]-q[0]); 
        ++p; 
        ++q; 
       } 
       p += nOffset; 
       q += nOffset; 
      } 
     } 

     b.UnlockBits(bmData); 
     c.UnlockBits(data2); 
     return b; 
    } 
+0

它在哪裏崩潰? – 2013-04-09 10:50:53

+0

WPF?爲什麼不使用'WriteableBitmap'而不是'System.Drawing'類型? – 2013-04-09 10:51:04

+1

請告訴我們'object.ReferenceEquals(b,c)'的結果在方法開始時會返回。 – 2013-04-09 10:51:41

回答

0

監守你只需要比較圖像,我會suggesst開放只讀模式,即:

BitmapData data2 = c.LockBits(new System.Drawing.Rectangle(0, 
               0, 
               c.Width, 
               c.Height), 
        ImageLockMode.ReadOnly, 
        System.Drawing.Imaging.PixelFormat.Format24bppRgb);