2012-02-07 46 views
3

我知道非常类似的问题在这里问过去 - 但也有我的问题的解决方案:还是内存泄漏.NET4 - 结合内存的BitmapImage成图像源

我从内存中加载一个图像到一个的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绑定到图像对象的源(在页面上)。

问题是:这将导致内存泄漏

你甚至不觉得这用廓线 - 只有.NET内存分析器让我上(很多在我的情况达2-3图像300MB!)轨道(因为它是在非托管内存中的所有字节去 - 所以蚂蚁告诉我“.NET使用分配给应用367,3MB的19,24MB总专用字节” - 漂亮的): Memory-Profiler output

enter image description here

无论我尝试什么 - 我都没有得到这个泄漏。 尝试(单,一次全部):

  • 清晰的视觉树/删除上卸载图像
  • 设置图像-来源为空
  • 使用图像刷的矩形,而不是图像
  • 其他CacheOptions而不设置的MemoryStream
  • 不冻结图像

我不明白这一点 - 是真的! 只要我停止使用源中的图像,一切都可以(没有泄漏)。

有人可以尝试吗?

REMARK 看起来这是完全没有错误(见我的第二个评论) - 我要检查这个,所以我会让这个问题打开了 - 这也许可以用这个其他的问题有所帮助

+0

嗯......不知道这是不是真的* *由于“泄漏”的内存泄漏似乎约为550MB,此后一些(200-300MB)内存被释放,如果我再次加载位图 - 但仍然不是所需的行为...... – Carsten 2012-02-07 12:32:15

+1

好吧......哦,我的 - 似乎这个问题是由愚蠢的图片使用造成的。这些图片是由用户提供的(某种地图 - 黑/白,有很多白色),我只查看了文件大小(大约1MB) - 但是这些是.JPG,图片的分辨率高达10,000 X 5,000像素(sic!) - 将其解压缩为32位,每张图片轻松达到> 150MB ...所以我想我可以称这个解决方案为“解决方案”,但现在我会打开它 - 也许有一些好的评论,我仍然必须尝试“解决方法”(=合理的图片) – Carsten 2012-02-07 12:54:11

回答

0

对不起 - 这确实不是“错误”,而是由高分辨率图片造成的。

在此请评论,如果我要删除的问题,或者如果我要离开这里的其他人可能接触到同样的情况......

+0

只需选择此作为正确的答案。 – Will 2012-02-10 16:42:13