0

使用下面的代码访问三个不同位图的像素数据时出现此错误:

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

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 回答