【发布时间】:2015-07-25 05:43:48
【问题描述】:
我从 DataStream 加载位图。我尝试从方法返回加载的位图,然后将其用作克隆新位图的源。不幸的是,Clone() 调用会导致 OutOfMemoryException。通过测试,我意识到 Clone() 在处理底层数据流之前是成功的。
如何创建一个独立于加载它的流而存在的位图?
DxScreenCapture cap = new DxScreenCapture();
var surface = cap.CaptureScreen();
Bitmap png;
Rectangle rect;
PixelFormat fmt;
using (DataStream stream = Surface.ToStream(surface, ImageFileFormat.Bmp))
{
png = new Bitmap(stream);
fmt = png.PixelFormat;
rect = new Rectangle(911, 170, 32, 14);
// Works
Bitmap rgn1 = png.Clone(rect, fmt);
}
// Throws OutOfMemoryException
Bitmap rgn2 = png.Clone(rect, fmt);
【问题讨论】:
-
GDI+ 编解码器是惰性的,它们只在必要时访问原始图像存储。当您关闭流并尝试使用位图时,Kaboom 出现了一个糟糕的异常。 Clone() 不是一种解决方法,它是一个浅拷贝。如果您不想跟踪生命周期以便延迟关闭流,那么您必须制作一个副本。使用 stream.CopyTo() 将其复制到 MemoryStream 中,不要费心处理它。