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

时间:2017-05-22 08:49:34

标签: c# pointers memory bitmap

我试图比较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上的异常:

  

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

我认为用指针逻辑的东西是错误的......但是找不到。

有人在这看到问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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