重写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代码而不存在不安全

要获得对位图数据的透明高效访问(比使用LockBits的任何复制技术都快),您可以使用以下技术,该技术不需要将代码标记为不安全(但需要FullTrust):

  • 为位图数据创建byte[]
  • 使用GCHandle.Alloc()调用将其固定
  • 使用Marshal.UnsafeAddrOfPinnedArrayElement()获取byte[]的物理地址
  • 使用获取IntPtr的构造器在此基础上创建位图对象
  • Bitmapbyte[]上施展魔法

重要提示:尽量避免长时间固定对象(妨碍GC效率),不要忘记在finally子句中处理位图和GC句柄!

当然,如果您需要流,您也可以在此byte[]上创建一个普通的MemoryStream