如何处理可写位图?(WPF)

Mar*_*rio 8 memory dispose writeablebitmap

前段时间我发布了一个与WriteableBitmap内存泄漏相关的问题,虽然我收到了与该问题相关的精彩提示,但我仍然认为有一个严重的错误/(我犯了错误)/(混乱)/(其他一些东西)这里.

所以,这是我的问题:

假设我们有一个带有图像和按钮的WPF应用程序.图像的源是一个非常大的位图(3600*4800像素),当它在运行时显示时,应用程序消耗~90 MB.

现在假设我希望从图像源(真正的大图像)实例化一个WriteableBitmap,当发生这种情况时,应用程序消耗大约220 MB.

现在到了棘手的部分,当对图像的修改(通过WriteableBitmap)结束时,对WriteableBitmap的所有引用(至少是我所知道的那些)都被销毁(在方法结束时或通过设置它们)为null)应释放writeableBitmap使用的内存,应用程序消耗应返回到~90 MB.问题是有时它会返回,有时却不会.

这是一个示例代码:

// The Image's source whas set previous to this event
private void buttonTest_Click(object sender, RoutedEventArgs e)
    {
        if (image.Source != null)
        {
            WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source);

            bitmap.Lock();

            bitmap.Unlock();

            //image.Source = null;
            bitmap = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,引用是本地的,并且应该在方法结束时释放内存(或者当垃圾收集器决定这样做时).但是,该应用程序可能消耗~224 MB直到宇宙结束.

任何帮助都会很棒.

nyx*_*tom 0

是否需要以相同的分辨率和像素渲染Bitmap图像?您可以以低得多的像素集创建 writeablebitmap 并调用 render 方法。由于 writeablebitmap 在调用 render 时携带对原始 uielement 的引用,因此在这种情况下,您将拥有 3 个块:1) 原始 uielement,2) writeablebitmap 中的像素,3) 对复制的原始内容的引用。

我在内存泄漏方面与 writeablebitmap 遇到了类似的问题,我通过查看此链接修复了它: http ://www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s -大图像问题和您可以做什么.aspx

如果您创建另一个 writeablebitmap 并复制像素,然后处理第一个 writeablebitmap,您应该会看到一些内存释放 - 至少在我的场景中是这样。