如何用另一个图像替换图像中的块?

时间:2016-08-16 23:26:52

标签: c# image-processing

我正在尝试用另一张图片替换图像块,但是当我转到第二行时,我在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
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

这里有一些接受任何格式的代码:

city.sun

结果:

enter image description here

enter image description here

修改

这最终变得更加简单:)

How to crop an image using C#?