- 如果封送处理数据而不是设置scan0(直接或通过BitMap()的重载)进行设置,这是安全的。您不想让托管对象固定,这将限制垃圾收集器。
- 如果您进行复制,绝对安全。
- 输入数组是托管的,可以由GC进行移动,scan0是非托管指针,如果移动数组,该指针将过期。Bitmap对象本身是受管理的,但通过句柄在Windows中设置scan0指针。
- ImageLockMode.UserInputBuffer是吗?显然,它可以传递给LockBits,也许它告诉Bitmap()复制输入数组数据。
从数组创建灰度位图的示例代码:
var b = new Bitmap(Width, Height, PixelFormat.Format8bppIndexed); ColorPalette ncp = b.Palette; for (int i = 0; i < 256; i++) ncp.Entries[i] = Color.FromArgb(255, i, i, i); b.Palette = ncp; var BoundsRect = new Rectangle(0, 0, Width, Height); BitmapData bmpData = b.LockBits(BoundsRect, ImageLockMode.WriteOnly, b.PixelFormat); IntPtr ptr = bmpData.Scan0; int bytes = bmpData.Stride*b.Height; var rgbValues = new byte[bytes]; // fill in rgbValues, e.g. with a for loop over an input array Marshal.Copy(rgbValues, 0, ptr, bytes); b.UnlockBits(bmpData); return b;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)