/// <summary> /// 平移图像 /// </summary> /// <param name="bmp"></param> /// <param name="tx"></param> /// <param name="ty"></param> /// <returns></returns> public static Bitmap Translation(Bitmap bmp, int tx, int ty) { if (bmp == null || (tx == 0 && ty == 0)) return bmp; Rectangle bmpRect = new Rectangle(0, 0, bmp.Width, bmp.Height); BitmapData bmpData = bmp.LockBits(bmpRect, ImageLockMode.ReadWrite, bmp.PixelFormat); int bytes = bmpData.Stride * bmp.Height; byte[] rgbValues = new byte[bytes]; IntPtr ptr = bmpData.Scan0; Marshal.Copy(ptr, rgbValues, 0, bytes); byte[] newRgbValues = new byte[bytes]; for (int i = 0; i < bytes; i++) newRgbValues[i] = 255; for (int y = 0; y < bmp.Height; y++) { if (y + ty >= bmp.Height || y + ty < 0) continue; for (int x = 0; x < bmp.Width * 3; x++) { if (x + tx * 3 >= bmp.Width * 3 || x + tx * 3 < 0) continue; newRgbValues[(y + ty) * bmpData.Stride + x + tx * 3] = rgbValues[y * bmpData.Stride + x]; } } Marshal.Copy(newRgbValues, 0, ptr, bytes); bmp.UnlockBits(bmpData); return bmp; }