C#通过指针处理位图像素

C#通过指针处理位图像素,c#,pointers,memory,bitmap,C#,Pointers,Memory,Bitmap,我试图比较2字节数组,其中包含232bpp图像的RGBA值(在我的例子中是1920X1080),并对它们的位进行一些操作(与问题无关) 我使用指向第一个所需像素的int指针一次比较4个字节 这是我的代码: private unsafe void Process(byte[] prev, byte[] curr, Rectangle rect) { fixed (byte* image1BasePtr = prev, image2BasePtr = curr) { int offset

我试图比较2字节数组,其中包含2
32bpp
图像的
RGBA
值(在我的例子中是1920X1080),并对它们的位进行一些操作(与问题无关)

我使用指向第一个所需像素的
int
指针一次比较4个字节

这是我的代码:

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.

    }
  }
}
在这种情况下,扫描将从1000像素开始,到位图的末尾(在我的例子中是1920),从第一行(
Y=0
)到最后一行

当我运行代码时,我在
y=1079和x=1630上得到异常:

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

我认为我的指针逻辑有问题。。。。但是找不到什么

有人看到这个问题了吗


提前谢谢。

我认为问题在于第一次偏移中的
+rect.X


当您在第二个for循环中从rect.X开始时,您不必第一次添加它。

我也这么认为。。。但是当我删除偏移量中的
rect.X
时。。。
if
条件永远不会为真(而且在我眼中看到的图像中几乎没有不同的像素)。。。。
Process(rgbprev, rgbcurr, new Rectangle(1000, 0, 920, 1080));