2013-06-03 141 views
0

「嘗試讀取或寫入受保護的內存,這通常表示其他內存已損壞。」C# - Marshal.Copy:嘗試讀取或寫入受保護的內存

我在我的代碼的Marshal.Copy部分中遇到此錯誤。我確信我的數據沒有受到損壞也沒有受到保護。

我想知道這是怎麼發生的。 我有一個名單<>的位圖。這隻發生在我處理第一個索引[0]時。

因此,這裏是我是如何做到的: - 首先,我用這個代碼[此代碼獲取位圖的像素數據]

 Bitmap tmp_bitmap = BitmapFromFile[0]; 

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

     int length = bmpData.Stride * bmpData.Height; 

     byte[] bytes = new byte[length]; 

     // Copy bitmap to byte[] 
     Marshal.Copy(bmpData.Scan0, bytes, 0, length); 
     tmp_bitmap.UnlockBits(bmpData); 

它工作正常,沒有出現錯誤。

然後,我使用這個代碼[這將刪除像素數據線掃描填充]

byte[] bytes = new byte[bmpData.Width * bmpData.Height * 3]; 
for (int y = 0; y < bmpData.Height; ++y) { 
IntPtr mem = (IntPtr)((long)bmpData.Scan0 + y * bmpData.Stride * 3); 
Marshal.Copy(mem, bytes, y * bmpData.Width * 3, bmpData.Width * 3); //This is where the exception is pointed. 
} 

它給了我,每當我處理的第一個形象的錯誤 - 倒數第二,沒有問題。

我希望你能幫助我。 預先感謝您。

+0

在*解鎖後,您正在寫回'bmpData' *。 –

+0

@RogerRowland有可能「我應用此代碼」的意思是「在'UnlockBits'之前」 –

回答

2

你似乎正在考慮每行的3倍邁步;你的代碼只能用於圖像的前三分之一;之後你確實超出了你允許的範圍。基本上:

bmpData.Scan0 + y * bmpData.Stride * 3 

看起來真的狡猾。 「stride」每行使用的字節數(包括填充)。通常情況下,這只是:

bmpData.Scan0 + y * bmpData.Stride 
+0

哦,你是對的!現在我的問題解決了。非常感謝你! – CudoX

相關問題