如何创建Bitmap深层副本

时间:2011-05-04 11:45:32

标签: c# bitmap deep-copy

我正在处理我的应用程序中的Bitmaps,出于某些目的,我需要创建Bitmap的深层副本。有一种优雅的方式怎么做?

我试过

Bitmap deepCopy = original.Clone();

,显然这不会创建一个深层副本,而是浅层副本。 我的下一个尝试是创建一个新的位图

Bitmap deepCopy = new Bitmap(original);

不幸的是,这个构造函数是Bitmap(Image),而不是Bitmap(Bitmap),而Bitmap(Image)会将我漂亮的8bppIndexed Pixelformat转换为另一个。

另一种尝试是使用MemoryStream

public static Bitmap CreateBitmapDeepCopy(Bitmap source)
{
    Bitmap result;
    using (MemoryStream stream = new MemoryStream())
    {
        source.Save(stream, ImageFormat.Bmp);
        stream.Seek(0, SeekOrigin.Begin);
        result = new Bitmap(stream);
    }
    return result;
}

嗯,这也不起作用,因为必须在Bitmap的整个生命周期内打开MemoryStream。

所以,我总结了所有的后端,我真的很想看到一个很好的优雅方式来创建一个Bitmap深层副本。谢谢你们:)

6 个答案:

答案 0 :(得分:20)

B.Clone(new Rectangle(0, 0, B.Width, B.Height), B.PixelFormat)

答案 1 :(得分:2)

我的环境:Windows 10,Visual Studio 2015,Framework 4.5.2

对我有用。

Bitmap deepCopy = new Bitmap(original);

答案 2 :(得分:1)

您可以序列化位图,然后反序列化它。位图是可序列化的。

答案 3 :(得分:1)

我偶然发现的另一种方法就是旋转或翻转图像。在引擎盖下似乎创建了一个全新的位图副本。进行两次旋转或翻转可以得到原始图像的精确副本。

result.RotateFlip(RotateFlipType.Rotate180FlipX);
result.RotateFlip(RotateFlipType.Rotate180FlipX);

答案 4 :(得分:0)

假设您已经有一个名为original的位图,其中有一些内容

Bitmap original = new Bitmap( 200, 200 );     
Bitmap copy = new Bitmap(original.Width, original.Height);
using (Graphics graphics = Graphics.FromImage(copy))
{
  Rectangle imageRectangle = new Rectangle(0, 0, copy.Width, copy.Height);
  graphics.DrawImage( original, imageRectangle, imageRectangle, GraphicsUnit.Pixel);
}

这应创建相同大小的副本,并将原件绘制到副本中。

答案 5 :(得分:0)

您可以在代码中放置以下类:

dataBase <- data.frame(a = rnorm(15), date = unlist(read.table(text = '"30/06/2020" "27/08/2020" "30/06/2020" "28/08/2020" "30/06/2020"
"28/08/2020" "30/06/2020" "01/08/2020" "30/06/2020" "01/08/2020"
"01/08/2020" "30/06/2020" "30/06/2020" "01/08/2020" "30/06/2019"')))

dataBase

#              a       date
# V11  1.8071121 30/06/2020
# V12  0.1294905 28/08/2020
# V13 -0.8860187 01/08/2020
# V21 -1.5073589 27/08/2020
# V22  1.2067775 30/06/2020
# V23  1.1733465 30/06/2020
# V31  0.7798806 30/06/2020
# V32 -0.8435670 01/08/2020
# V33  0.8572508 30/06/2020
# V41 -2.3080748 28/08/2020
# V42  1.4869950 30/06/2020
# V43  0.1705372 01/08/2020
# V51  1.8373611 30/06/2020
# V52  0.5101801 01/08/2020
# V53 -0.9052635 30/06/2019

此方法已调整为与 public static class BitmapExtensions { public static Bitmap DeepClone(this Bitmap source) { IFormatter formatter = new BinaryFormatter(); Stream stream = new MemoryStream(); using (stream) { formatter.Serialize(stream, source); stream.Seek(0, SeekOrigin.Begin); return (Bitmap)formatter.Deserialize(stream); } } } 一起使用。如果您想使用通用方法,请查看下面的链接。通过将方法命名为 Bitmap,我们消除了破坏现有代码的风险(在下面的答案中,该方法称为 DeepClone(),因此它是一个覆盖方法)。

原文来自此处:https://stackoverflow.com/a/43042865/13574233

虽然这个方法需要很多时间。如果您正在寻找一种性能良好的方法,这可能不是您想要的。