使用锁位访问像素数据时出现内存错误

本文关键字:内存 错误 数据 像素数 访问 像素 | 更新日期: 2023-09-27 17:56:47

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

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

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。有什么想法吗?谢谢。:)

使用锁位访问像素数据时出现内存错误

  1. PixelFormat.Format24bppRgb 表示每个像素上的 24 位 = 3 字节,因此,方法 LockBits 锁定 1280 * 720 * 3 = 2764800 字节

  2. 将锁定数据上的指针投射到 int*。int 的大小 = 32 位 = 4 字节。

  3. 因此,您尝试处理 1280 * 720 * 4 = 3686400 字节,而您有锁 2764800(请参阅 1)。失 配。