0

ビデオをレンダリングするためBitmapに Direct3Dにコピーするコードがいくつかあります。Textureシステムの負荷が高い場合、 へAccessViolationExceptionの呼び出しで時折 が表示されBitmap.LockBitsます。

何が起こるかの非常に簡単な例を次に示します。

// Get a PixelFormat.Format24bppRgb image
Bitmap bitmap24 = getVideoFrame();

// Copy into a 32bpp ARGB texture
BitmapData bitmapData = null;
try
{
    // Why am I allowed to do this?
    bitmapData = this.bitmap24.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                                        ImageLockMode.ReadOnly, 
                                        PixelFormat.Format32bppArgb);

    // Blit from bitmapData to texture32
    Texture texture32 = convertBitmapToTexture(bitmapData);
}
finally
{
    if (bitmapData != null)
        this.bitmap.UnlockBits(bitmapData);
}

ビットマップBitmap.LockBits形式PixelFormat.Format32bppArgbPixelFormat.Format24bppRgb. LockBitsピクセルあたり 3 バイトから 4 バイトに自動的に拡張する必要があると思います。

拡張LockBitsがこれらの例外を引き起こしている可能性はありますか? たまにしか起こらないのはなぜですか?

4

1 に答える 1

0

LockBits は、指定した形式でビットマップをメモリに保存します。

AccessViolationExceptionアクセスするはずのないメモリにアクセスしているときに発生します。これが起こる 2 つのシナリオを考えることができます。

1) 使用していImageLockMode.ReadOnlyます..実際にピクセルの値を変更しようとしている場所はありますか? おそらく、これを に変更してみてImageLockMode.ReadWrite、それが役立つかどうかを確認してください。

2) バッファがどれだけ大きくなければならないかについて混乱しており、バッファの末尾を超えてコピーしようとしている関数が関数に含まMarshal.Copyれています。convertBitmapToTexture

32bppArgb を使用している場合はint、s ではなく sで考える方が簡単かもしれません。byteそうすれば、混乱に陥る可能性は低くなります。

于 2012-08-21T23:57:03.353 に答える