.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 カメラから画像オブジェクトを取得します。