我试图比较2个字节的数组,这些数组保存RGBA
个值为32bpp
的图像(在我的情况下为1920X1080),并对其位进行一些操作(不是真的相关)问题)。
我一次比较4个字节,使用int
指针指向第一个所需像素。
这是我的代码:
private unsafe void Process(byte[] prev, byte[] curr, Rectangle rect)
{
fixed (byte* image1BasePtr = prev, image2BasePtr = curr)
{
int offset = (rect.Y * mainBmp.Width) + rect.X;
int* prevPtr = (int*)image1BasePtr;
prevPtr += offset;
int* currPtr = (int*)image2BasePtr;
currPtr += offset;
int toY = rect.Y + rect.Height;
int toX = rect.X + rect.Width;
for (int y = rect.Y; y < toY; y++)
{
for (int x = rect.X; x < toX; x++)
{
if (currPtr[x] != prevPtr[x]) // Compare 4 bytes at once.
{
//Here i do somthing..doesn't really matter what
}
}
prevPtr += mainBmp.Width; // Advance pointers to the next line.
currPtr += mainBmp.Width;// Advance pointers to the next line.
}
}
}
如果我不想处理整个图片,我可以选择要处理的特定区域。
这是电话(例如):
Process(rgbprev, rgbcurr, new Rectangle(1000, 0, 920, 1080));
在这种情况下,扫描将从1000的像素开始,到位图的末尾(在我的情况下为1920),从第一行(Y=0
)到最后一行。
当我运行代码时,我得到了y=1079 and x=1630
上的异常:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
我认为用指针逻辑的东西是错误的......但是找不到。
有人在这看到问题吗?
提前致谢。
答案 0 :(得分:0)
我认为问题只在于您的第一次偏移中的+ rect.X
。
当您在第二次for循环中从rect.X开始时,您不必在第一次添加它。