0

我正在.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 从网络摄像头获取图像对象。

4

1 回答 1

0

As Hans pointed out, I have to make a deep copy of the bitmap and everything works. Otherwise I'm using an image that is already disposed. This is a silent error though, until I declare some big variables, which use up the disposed memory, that's when the GC throws some seemingly random errors.

于 2012-08-07T09:35:13.737 回答