0

以下のコードを使用して 3 つの異なるビットマップのピクセル データにアクセスすると、このエラーが発生します。

保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

C# コード:

var bmpDataA = bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
var bmpDataB = bitmap2.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
var bmpDataC = bitmap3.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

const int width = 1280;
const int height = 720;
int npixels = width * height;

unsafe
{
    int* pPixelsA = (int*)bmpDataA.Scan0.ToPointer();
    int* pPixelsB = (int*)bmpDataB.Scan0.ToPointer();
    int* pPixelsC = (int*)bmpDataC.Scan0.ToPointer();

    for (int i = 0; i < npixels; ++i)
    {
        if (pPixelsA[i] == pPixelsB[i]) // <--- Error occurs on this line
        {
            pPixelsC[i] = Color.Black.ToArgb();
        }
    }
}
bitmap.UnlockBits(bmpDataA);
bitmap2.UnlockBits(bmpDataB);
bitmap3.UnlockBits(bmpDataC);

デバッガーを使用すると、変数npixels= 921600 であり、エラーが発生すると (for ループ) 変数i= 691200 であることがわかります。問題が何であるかはわかりません。ピクセル形式を 32bppRgb に変更しても問題はなく、正常に動作します。24bppRgb で作業したくないだけです。何か案は?ありがとう。:)

4

1 に答える 1

4
  1. PixelFormat.Format24bppRgb は、各ピクセルで 24 ビット = 3 バイトを意味するため、LockBits メソッドは 1280 * 720 * 3 = 2764800 バイトをロックします。

  2. ロックされたデータのポインターを int* にキャストします。int のサイズ = 32 ビット = 4 バイト。

  3. したがって、1280 * 720 * 4 = 3686400 バイトを処理しようとしていますが、2764800 をロックしています (1 を参照)。ミスマッチ。

于 2013-01-31T16:48:08.273 に答える