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 をスローします。これは多くの場合、他のメモリが破損していることを示しています。

...または「bytes」の宣言は
FatalExecutionEngineError をスローします: ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0x3690 の 0x6819d142 でした。エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。

...または例外はまったくなく、すべて正常に動作します。

何が起こっている?

追加情報: DirectShow を使用して Web カメラから画像オブジェクトを取得します。

4

1 に答える 1

0

Hans が指摘したように、ビットマップのディープ コピーを作成する必要があり、すべてが機能します。それ以外の場合は、既に破棄されている画像を使用しています。ただし、これは暗黙のエラーですが、破棄されたメモリを使い果たすいくつかの大きな変数を宣言するまでは、GC が一見ランダムなエラーをスローします。

于 2012-08-07T09:35:13.737 に答える