我正在.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:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
...或'bytes'的声明抛出
FatalExecutionEngineError:运行时遇到致命错误。错误的地址是0x6819d142,在线程0x3690上。错误代码是0xc0000005。此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM-interop或PInvoke的用户封送错误,这可能会破坏堆栈。
......或者根本没有例外,一切正常。
发生了什么事?
其他信息:我使用DirectShow从网络摄像头获取图像对象。
答案 0 :(得分:0)
汉斯指出,我必须制作位图的深层副本,一切正常。否则我正在使用已经处理过的图像。这是一个无声的错误,直到我声明一些大的变量,这些变量耗尽了已处理的内存,就在GC抛出一些看似随机的错误时。