我正在.NET (VB 2010) 中进行一些图像处理。我正在使用以下代码(它还没有做任何事情):
Sub Manipulate(IMG As Bitmap)
' Dim foo(100000) As Integer - will need it later...
Dim bd = IMG.LockBits(New Rectangle(0, 0, IMG.Width, IMG.Height),
Imaging.ImageLockMode.ReadWrite,
Imaging.PixelFormat.Format24bppRgb)
Dim absstride = Math.Abs(bd.Stride)
Dim numbytes = absstride * IMG.Height
Dim bytes(numbytes - 1) As Byte
Dim flipped = bd.Stride < 0
Dim ptr = If(flipped, bd.Scan0 - numbytes + absstride, bd.Scan0)
System.Runtime.InteropServices.Marshal.Copy(ptr, bytes, 0, numbytes)
' I'm going to put sg here
System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, numbytes)
IMG.UnlockBits(bd)
End Sub
这非常适合简单的目的(例如,使图像变亮),但我的算法需要一些大变量(参见上面的“foo”)。声明它时(取消注释该行),我突然得到例外:
取决于'foo'的大小......
...第一个 Marshal.Copy() 抛出
AccessViolationException: Attempted to read or write protected memory。这通常表明其他内存已损坏。
...或“字节”的声明抛出
FatalExecutionEngineError:运行时遇到致命错误。错误地址位于线程 0x3690 上的 0x6819d142。错误代码为 0xc0000005。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。
...或者根本没有例外,一切正常。
到底是怎么回事?
附加信息:我使用 DirectShow 从网络摄像头获取图像对象。