Bitmap.LockBits是否将位图"固定"到内存中?

Rob*_*cks 5 .net c# memory bitmap lockbits

我最近使用锁定的位图,并且我一直"试图访问无效内存"错误.这主要是因为位图已在内存中移动.有些人GCHandle.Alloc()用来在CLR中分配内存并固定它.不Bitmap.LockBits()这样做?我不明白"锁定"内存和"固定"内存之间的区别.你能解释术语和差异吗?

Mar*_*uła 8

GCHandle.Alloc是一种更通用的方法,允许您为任何托管对象分配句柄并将其固定在内存中(或不固定).固定内存会阻止GC移动它,这在您必须将某些数据(例如数组)传递给非托管代码时尤其有用.

GCHandle.Alloc 无法以任何方式帮助您访问位图的数据,因为固定此对象只会阻止托管对象移动(Bitmap对象)(并进行垃圾回收).

然而,Bitmap是本机GDI + BITMAP结构的包装器.它不会将数据保存在您必须固定的任何托管数组中,它只是管理了GDI +位图对象的本机句柄.因为这Bitmap.LockBits是一种告诉这个位图的方式,你有兴趣访问它的内存,它只是一个GdipBitmapLockBits函数包装器.所以你需要调用它更多地与你使用GDI +位图的事实有关,而不是你在使用GC的托管环境中工作的事实.

一旦你使用了,LockBits你应该能够使用指针访问它的内存BitmapData.Scan0- 它是数据的第一个字节的地址.你不应该长时间遇到问题,因为你不能访问后面的内存BitmapData.Scan0 + Height * Stride.

UnlockBits当你完成时,请记住.