重写LockBits代码而不存在不安全
本文关键字:不存在 不安全 代码 LockBits 重写 | 更新日期: 2023-09-27 18:20:19
如何在没有不安全修饰符的情况下重写此代码?
var bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
var size = Math.Abs(bmpData.Stride) * bitmap.Height;
var stream = new UnmanagedMemoryStream((byte*)bmpData.Scan0, size));
要获得对位图数据的透明高效访问(比使用LockBits的任何复制技术都快),您可以使用以下技术,该技术不需要将代码标记为不安全(但需要FullTrust):
- 为位图数据创建
byte[]
- 使用
GCHandle.Alloc()
调用将其固定 - 使用
Marshal.UnsafeAddrOfPinnedArrayElement()
获取byte[]
的物理地址 - 使用获取IntPtr的构造器在此基础上创建位图对象
- 在
Bitmap
和byte[]
上施展魔法
重要提示:尽量避免长时间固定对象(妨碍GC效率),不要忘记在finally子句中处理位图和GC句柄!
当然,如果您需要流,您也可以在此byte[]
上创建一个普通的MemoryStream
。