Sto scrivendo un metodo statico ma non mi copia le colonne per bene: dove sbaglio?

codice:
 public static void MarshallCopy(System.Drawing.Bitmap b1, int x0, int y0, System.Drawing.Bitmap b2)
        {
            //Copio il contenuto di b1 in bmdata1
            System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, b1.Width, b1.Height);
            System.Drawing.Imaging.BitmapData bmdata1 = b1.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                b1.PixelFormat);
            //Copio il contenuto di b2 in bmdata2
            rect = new System.Drawing.Rectangle(0, 0, b2.Width, b2.Height);
            System.Drawing.Imaging.BitmapData bmdata2 = b2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                b2.PixelFormat);
            //Array di rgbvalues in bmdata1
            int bytes1 = Math.Abs(bmdata1.Stride) * b1.Height;
            byte[] rgbvalues1 = new byte[bytes1];
            //Array di rgbvalues in bmdata2
            int bytes2 = Math.Abs(bmdata2.Stride) * b2.Height;
            byte[] rgbvalues2 = new byte[bytes2];
            
            // Puntatore in b1 ad inizio area 
            IntPtr pt1 = bmdata1.Scan0;
            // Puntatore in b2 ad inizio bmdata1 
            IntPtr pt2 = bmdata2.Scan0;
            // Copia dei valori in bmdata1
            System.Runtime.InteropServices.Marshal.Copy(pt1, rgbvalues1, 0, bytes1);
            // Copia dei valori in bmdata2
            System.Runtime.InteropServices.Marshal.Copy(pt2, rgbvalues2, 0, bytes2);
            //puntatore in b1 di (x0,y0) è 4 * (x0 + b1.Width * y0) 
            int punt2=0; //puntatori int non IntPtr
            for (int p = 0; p < b2.Width; p++)
            {
                pt1 = (System.IntPtr)(4 * (x0 + b1.Width * (y0+p)));
                for (int i = 0; i < b2.Width; i++)
                {
                    rgbvalues1[(int)pt1 + i] = rgbvalues2[punt2 + i];
                    punt2++;
                }
             
            }
            // Copia dei valori rgb in b1
            pt1 = bmdata1.Scan0;
            System.Runtime.InteropServices.Marshal.Copy(rgbvalues1, 0, pt1, bytes1);
            // Chiusura b1.
            b1.UnlockBits(bmdata1);
        
        }