【问题标题】:Cannot Clone Bitmap after Stream Disposed流处理后无法克隆位图
【发布时间】: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 中,不要费心处理它。

标签: c# directx slimdx


【解决方案1】:

根据 Hans 的评论,我只是从原始位图创建了一个新位图。

Bitmap copy;
using (DataStream stream = Surface.ToStream(surface, ImageFileFormat.Bmp))
{
    Bitmap orig = new Bitmap(stream);
    copy = new Bitmap(orig);
}

// Able to use copy after stream is disposed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2015-04-17
    • 2010-11-22
    • 2011-03-08
    • 2016-11-11
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多