我正在处理我的应用程序中的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深层副本。谢谢你们:)
答案 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
虽然这个方法需要很多时间。如果您正在寻找一种性能良好的方法,这可能不是您想要的。