我知道非常类似的问题在这里问过去 - 但也有我的问题的解决方案:还是内存泄漏.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总专用字节” - 漂亮的):
无论我尝试什么 - 我都没有得到这个泄漏。 尝试(单,一次全部):
- 清晰的视觉树/删除上卸载图像
- 设置图像-来源为空
- 使用图像刷的矩形,而不是图像
- 其他CacheOptions而不设置的MemoryStream
- 不冻结图像
我不明白这一点 - 是真的! 只要我停止使用源中的图像,一切都可以(没有泄漏)。
有人可以尝试吗?
REMARK 看起来这是完全没有错误(见我的第二个评论) - 我要检查这个,所以我会让这个问题打开了 - 这也许可以用这个其他的问题有所帮助
嗯......不知道这是不是真的* *由于“泄漏”的内存泄漏似乎约为550MB,此后一些(200-300MB)内存被释放,如果我再次加载位图 - 但仍然不是所需的行为...... – Carsten 2012-02-07 12:32:15
好吧......哦,我的 - 似乎这个问题是由愚蠢的图片使用造成的。这些图片是由用户提供的(某种地图 - 黑/白,有很多白色),我只查看了文件大小(大约1MB) - 但是这些是.JPG,图片的分辨率高达10,000 X 5,000像素(sic!) - 将其解压缩为32位,每张图片轻松达到> 150MB ...所以我想我可以称这个解决方案为“解决方案”,但现在我会打开它 - 也许有一些好的评论,我仍然必须尝试“解决方法”(=合理的图片) – Carsten 2012-02-07 12:54:11