Does Bitmap.LockBits “pin” a bitmap into memory?

后端 未结 2 1487
长发绾君心
长发绾君心 2020-12-21 01:05

I\'m using locked bitmaps a lot recently, and I keep getting \"attempted to access invalid memory\" errors. This is mostly because the bitmap has been moved in memory. Some

2条回答
  •  南方客
    南方客 (楼主)
    2020-12-21 01:17

    GCHandle.Alloc is a more generic method, that allows you to allocate a handle to any managed object and pin it in memory (or not). Pinning memory prevents GC from moving it around, which is especially useful when you have to pass some data, for example an array, to a unmanaged code.

    GCHandle.Alloc will not help you access bitmap's data in any way, because pinning this object will just prevent the managed object from moving around (the Bitmap object) (and being garbage collected).

    Bitmap however is a wrapper around native GDI+'s BITMAP structure. It doesn't keep data in any managed array that you would have to pin, it just managed a native handle to GDI+ bitmap object. Because of that Bitmap.LockBits is a way of telling this bitmap that you are interested in accessing it's memory, and it's just a wrapper around GdipBitmapLockBits function. So your need of calling it has more to do with the fact that you are working with GDI+ bitmaps than with the fact, that you're working in managed environment with GC.

    Once you have used LockBits you should be able to access it's memory using pointers through BitmapData.Scan0 - it's an address of first byte of data. You should not have problems as long, as you do not access memory behind BitmapData.Scan0 + Height * Stride.

    And rememberto UnlockBits when you are done.

提交回复
热议问题