C#中Intptr类型分多次复制数据问题

1.介绍一下C#中Intptr复制数据的一些理论知识?WinApi.MoveMemory(Intptr dest+100,Intptr src+50,int size),当这种复制的方法加上一个偏倚量具体是啥意思?
2.现有一张图片数据为IntPtr1,图片宽度为10000,图片高度为5000。创建一个新的IntPtr2,申请好内存大小,怎么把IntPtr1的图片数据,图片宽度10000列中的第2000列到8000列舍弃,也就是说把图片的0-2000和8000-10000列,5000行的数据,复制到IntPtr2中,要怎么做。
3.问题2中的问题,可以用byte[]数组来完成吗。

可以按以下步骤实现:

计算IntPtr2需要的内存大小。由于只需要复制图片的0-2000和8000-10000列,因此IntPtr2的宽度为6000列。因此,IntPtr2需要的内存大小为 6000 x 5000 x 4(假设图片格式为RGBA,每个像素占用4字节)= 120 MB。

申请IntPtr2的内存空间。可以使用Marshal.AllocHGlobal方法来申请IntPtr2所需的内存空间。

IntPtr IntPtr2 = Marshal.AllocHGlobal(120 * 1024 * 1024); // 分配120MB的内存空间

复制IntPtr1的图片数据到IntPtr2中。由于只需要复制图片的0-2000和8000-10000列,因此需要按列循环复制像素数据。可以使用Marshal.Copy方法来复制像素数据。

// 复制IntPtr1的图片数据到IntPtr2中
int width1 = 10000;
int height1 = 5000;
int width2 = 6000;
int height2 = 5000;
int bytesPerPixel = 4; // 假设图片格式为RGBA,每个像素占用4字节

for (int y = 0; y < height2; y++)
{
    for (int x = 0; x < width2; x++)
    {
        int sourceX;
        if (x < 2000)
        {
            sourceX = x;
        }
        else if (x < 8000)
        {
            continue;
        }
        else
        {
            sourceX = x + 2000;
        }
        
        IntPtr sourceAddress = IntPtr1 + (sourceY * width1 + sourceX) * bytesPerPixel;
        IntPtr destAddress = IntPtr2 + (y * width2 + x) * bytesPerPixel;
        Marshal.Copy(sourceAddress, destAddress, bytesPerPixel);
    }
}

释放IntPtr2的内存空间。在使用完IntPtr2后,需要释放其占用的内存空间。可以使用Marshal.FreeHGlobal方法来释放IntPtr2的内存空间。

Marshal.FreeHGlobal(IntPtr2);