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

时间:2013-01-31 15:53:16

标签: c# memory bitmap lockbits

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

  

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

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 个答案:

答案 0 :(得分:4)

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

  2. 您将锁定数据上的指针转换为int *。 int的大小= 32位= 4字节。

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