C#通过指针处理位图像素
我试图比较2字节数组,其中包含2C#通过指针处理位图像素,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
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));