这就是我复制位图的方式:
[DllImport("kernel32.dll", EntryPoint = "CopyMemory")]
static extern void CopyMemory(IntPtr Destination, IntPtr Source, uint Length);
public static Bitmap KernellDllCopyBitmap(Bitmap bmp, bool CopyPalette = true)
{
Bitmap bmpDest = new Bitmap(bmp.Width, bmp.Height, bmp.PixelFormat);
if (!KernellDllCopyBitmap(bmp, bmpDest, CopyPalette))
bmpDest = null;
return bmpDest;
}
/// <summary>
/// Copy bitmap data.
/// Note: bitmaps must have same size and pixel format.
/// </summary>
/// <param name="bmpSrc">Source Bitmap</param>
/// <param name="bmpDest">Destination Bitmap</param>
/// <param name="CopyPalette">Must copy Palette</param>
public static bool KernellDllCopyBitmap(Bitmap bmpSrc, Bitmap bmpDest, bool CopyPalette = false)
{
bool copyOk = false;
copyOk = CheckCompatibility(bmpSrc, bmpDest);
if (copyOk)
{
BitmapData bmpDataSrc;
BitmapData bmpDataDest;
//Lock Bitmap to get BitmapData
bmpDataSrc = bmpSrc.LockBits(new Rectangle(0, 0, bmpSrc.Width, bmpSrc.Height), ImageLockMode.ReadOnly, bmpSrc.PixelFormat);
bmpDataDest = bmpDest.LockBits(new Rectangle(0, 0, bmpDest.Width, bmpDest.Height), ImageLockMode.WriteOnly, bmpDest.PixelFormat);
int lenght = bmpDataSrc.Stride * bmpDataSrc.Height;
CopyMemory(bmpDataDest.Scan0, bmpDataSrc.Scan0, (uint)lenght);
bmpSrc.UnlockBits(bmpDataSrc);
bmpDest.UnlockBits(bmpDataDest);
if (CopyPalette && bmpSrc.Palette.Entries.Length > 0)
bmpDest.Palette = bmpSrc.Palette;
}
return copyOk;
}
public static bool CheckCompatibility(Bitmap bmp1, Bitmap bmp2)
{
return ((bmp1.Width == bmp2.Width) && (bmp1.Height == bmp2.Height) && (bmp1.PixelFormat == bmp2.PixelFormat));
}
## ImageCopyBenchmark ##
图像尺寸:{宽度=1024,高度=1024}。
图像像素格式:Format8bppIndexed。
Bitmap.Clone():0,00 毫秒(不是 DeepCopy ......相同的像素数据 - 看这里)
Bitmap.Clone() + RotateFlip(获取深层副本):2,02 毫秒
KernellDllCopyBitmap:0,52 毫秒(最好的!)
MarshalCopyBitmap:2.21 毫秒