【问题标题】:still memory-leaks in .net4 - binding memory BitmapImage to Image-Source.net4 中仍然存在内存泄漏 - 将内存 BitmapImage 绑定到 Image-Source
【发布时间】:2012-02-28 20:25:58
【问题描述】:

我知道过去曾在这里问过非常相似的问题 - 但都没有解决我的问题:

我将内存中的图像加载到 BitmapImage 中:

    private static BitmapImage LoadImage(byte[] imageData)
    {
        if (imageData == null || imageData.Length == 0) return null;
        var image = new BitmapImage();
        using (var mem = new MemoryStream(imageData))
        {
            mem.Position = 0;
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = null;
            image.StreamSource = mem;
            image.EndInit();
        }
        image.Freeze();
        return image;
    }

然后使用它(通过 INotifyPropertyChange)将生成的 BitmapImage 绑定到 Image 对象的 Source(在页面上)。

问题是:这会泄漏内存(在我的情况下,2-3 张图像高达 300MB!)

您甚至没有使用 Profilers 找到这一点 - 只有 .net Memory Profiler 让我走上了正轨(因为它位于所有字节所在的非托管内存中 - 所以 ANTS 告诉我“.NET 正在使用 19,24MB 的 367,分配给应用程序的总私有字节数为 3MB” - 不错):

无论我尝试什么 - 我都无法消除这种泄漏。 尝试过(一次和全部):

  • 清除视觉树/卸载时删除图像
  • 将 Image-Source 设置为 null
  • 在 Rectangle 中使用 ImageBrush 而不是 Image
  • 其他不释放 MemoryStream 的 CacheOptions
  • 不要冻结图像

我不明白 - 真的! 一旦我停止使用源中的图像,一切都很好(没有泄漏)。

有人可以尝试任何选项吗?

备注 似乎这根本不是错误(请参阅我的第二条评论)-我必须检查一下,所以我现在让问题打开-也许这也可以帮助解决其他问题

【问题讨论】:

  • hmm... 不知道这是否是真的内存泄漏,因为“泄漏”似乎限制在大约 550MB - 在此之后一些 (200-如果我再次加载位图,将释放 300MB)内存 - 但这仍然不是一个理想的行为......
  • 嗯......哦,我的 - 似乎问题是由愚蠢的图片使用引起的。图片由用户提供(某种地图 - 黑色/白色和很多白色),我只查看了文件大小(大约 1MB) - 但这些是 .JPG 并且图片的分辨率高达 10,000 X 5,000 像素(原文如此!) - 所以将其解压缩为 32 位,您可以轻松达到每张图片 >150MB ......所以我想我可以称之为“已解决”,但我现在让它打开 - 也许有一些好的cmets,我仍然必须尝试“解决方法”(=合理的图片)

标签: wpf memory-leaks bitmapimage imagesource


【解决方案1】:

对不起,这确实不是“BUG”,而是由高分辨率图片引起的。

如果我应该删除这个问题或者我应该把它留在这里因为其他人可能会遇到同样的情况,请对此发表评论......

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2015-06-29
    • 2012-11-16
    • 1970-01-01
    • 2019-12-18
    • 2012-05-25
    相关资源
    最近更新 更多