使用下面的代码访问三个不同位图的像素数据时出现此错误:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
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。有任何想法吗?谢谢。 :)
答案 0 :(得分:4)
PixelFormat.Format24bppRgb表示每个像素上24位= 3字节,因此,方法LockBits锁定1280 * 720 * 3 = 2764800字节
您将锁定数据上的指针转换为int *。 int的大小= 32位= 4字节。
因此,您尝试处理1280 * 720 * 4 = 3686400字节,而锁定2764800(请参阅1)。不匹配。