我正在尝试用另一张图片替换图像块,但是当我转到第二行时,我在System.ArgumentOutOfRangeException
上获得了Marshal.Copy(rgbValues, startIndx, desPtr, bytes)
。我无法理解为什么我是这个图像处理的新手。这是我的代码:
public static void ReplaceImageBlock(Bitmap src, Bitmap des, int x, int y, int xParts, int yParts)
{
var srcRec = new Rectangle(0, 0, src.Width, src.Height);
BitmapData srcData = src.LockBits(srcRec,
ImageLockMode.ReadOnly, src.PixelFormat);
var desRec = new Rectangle(x, y, src.Width, src.Height);
BitmapData desData = des.LockBits(desRec, ImageLockMode.WriteOnly, des.PixelFormat);
int srcStride = srcData.Stride;
IntPtr srcPtr = srcData.Scan0;
int desStride = desData.Stride;
IntPtr desPtr = desData.Scan0;
int bytes = 3 * xParts;
var rgbIndex = 0;
//actual pixel values
int width = 3 * xParts; //3 bytes by xParts
int height = yParts;
var rgbValues = new byte[bytes];
// Populate rgbValues with src image
unsafe
{
byte* p = (byte*)(void*)srcPtr;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int index = (i * srcStride) + j;
rgbValues[rgbIndex++] = p[index];
}
rgbIndex = 0; // reset index
var startIndx = (i * desStride) + x;
Marshal.Copy(rgbValues, startIndx, desPtr, bytes);//copy to destination block
}
}
}