【发布时间】:2017-08-19 17:30:13
【问题描述】:
我需要来自另一个位图的位图的深层副本。现在,大多数解决方案都说类似this,这不是深拷贝。这意味着当我锁定原始位图时,副本也会被锁定,因为克隆是原始位图的浅拷贝。现在以下似乎对我有用,但我不确定这是否适用于所有情况。
public static Bitmap GetCopyOf(Bitmap originalImage)
{
Rectangle rect = new Rectangle(0, 0, originalImage.Width, originalImage.Height);
Bitmap retrunImage = new Bitmap(originalImage.Width, originalImage.Height, originalImage.PixelFormat);
BitmapData srcData = originalImage.LockBits(rect, ImageLockMode.ReadOnly, originalImage.PixelFormat);
BitmapData destData = retrunImage.LockBits(rect, ImageLockMode.WriteOnly, originalImage.PixelFormat);
int dataLength = Math.Abs(srcData.Stride) * srcData.Height;
byte[] data = new byte[dataLength];
Marshal.Copy(srcData.Scan0, data, 0, data.Length);
Marshal.Copy(data, 0, destData.Scan0, data.Length);
destData.Stride = srcData.Stride;
if (originalImage.Palette.Entries.Length != 0)
retrunImage.Palette = originalImage.Palette;
originalImage.UnlockBits(srcData);
retrunImage.UnlockBits(destData);
return retrunImage;
}
我需要更好、更优雅的方式来做到这一点。否则,请指出上述代码可能失败的一些情况。 TIA
【问题讨论】:
-
至于更优雅,您可以尝试使用
BinaryFormatter序列化为MemoryStream并将其反序列化为新的Bitmap;如果您可以接受,则取决于所需的性能。 -
我认为这是个好主意。谢谢。我需要尝试一下。这种性能下降对我来说不是一个交易破坏者:)
标签: c# image-processing bitmap deep-copy