C# 在不安全的情况下重写锁位代码
如何在没有不安全修饰符的情况下重写此代码C# 在不安全的情况下重写锁位代码,c#,unmanaged,C#,Unmanaged,如何在没有不安全修饰符的情况下重写此代码 var bmpData=bitmap.LockBits(新矩形(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,bitmap.PixelFormat); var size=Math.Abs(bmpData.Stride)*位图.Height; var stream=新的非托管内存流((字节*)bmpData.Scan0,size)); 要获得对位图数据的透明高效访问(比任何带锁位的复制技术都快
var bmpData=bitmap.LockBits(新矩形(0,0,bitmap.Width,bitmap.Height),ImageLockMode.ReadOnly,bitmap.PixelFormat);
var size=Math.Abs(bmpData.Stride)*位图.Height;
var stream=新的非托管内存流((字节*)bmpData.Scan0,size));
要获得对位图数据的透明高效访问(比任何带锁位的复制技术都快),您可以使用以下技术,该技术不需要将代码标记为不安全(但需要完全信任):
- 为位图数据创建一个
字节[]
- 用电话锁定它
- 使用获取
的物理地址字节[]
- 使用以下命令在此基础上创建位图对象
- 在
和位图
字节[]
当然,如果您需要流,也可以使用它。只需使用
MemoryStream
而不是非托管流。最终,锁位就是获取指向原始内存的指针,这从根本上说是一件不安全的事情。好的,它在IntPtr后面隐藏了void*,但它仍然是一个指针。@ppetrov是否有一个构造函数用于获取IntPtr?这似乎是一件不同寻常的事情:将流指向Scan0。你能澄清一下:你想在这里做什么吗?检查这篇文章中的VB示例(是的,我知道你问了一个C#问题,但是VB解决方案在Scan0上使用Marshal.ReadByte)