首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图像的WPF内存问题

图像的WPF内存问题
EN

Stack Overflow用户
提问于 2013-12-18 05:07:04
回答 2查看 2.5K关注 0票数 5

我好像有很大的内存消耗问题。当我第一次加载我的wpf应用程序时,它包含一个网格视图和一个观察集,应用程序大约是10 my。

单击网格视图中的项时,它将打开另一个窗口,该窗口包含图像控件,该控件将传递一个base64字符串,然后将该字符串转换为BitmapImage。

然后,应用程序从10 to跳到大约123 to。原始图像大小为64k,但我存储的所有图像都是base64字符串,我将这些字符串转换回byte[],然后转换为BitmapImage。是的我是想这么做的。

当我关闭窗口时,所有的公羊都得不到释放。我甚至打过电话给GC。

我使用下面的代码将base64映像转换为

代码语言:javascript
运行
复制
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.StreamSource = new SIO.MemoryStream(imageBytes);
bitmapImage.EndInit();
return bitmapImage;

然后将其分配给Image.Source

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-18 05:23:27

下面是一些提示和猜测,但是如果您使用内存分析器,您将能够看到占用内存的是什么。(例如CLR剖析器同样VS 2012广告2013内置内存配置文件工具和其他商业产品:.NET内存分析工具)

  • 为什么要从CacheOption BitmapCacheOption.None中指定这里

不要创建内存存储。所有对图像的请求都由图像文件直接填充。

相反,您可以使用OnLoad

在加载时将整个图像缓存到内存中。所有对图像数据的请求都是从内存存储中填充的。

我读到:如果您在许多位置显示图像,它们共享相同的底层内存。因此,如果您在多个地方显示相同的图像,那当然更好。

  • 在示例这里的注释中找到的另一个技巧

若要保存重要的应用程序内存,请设置DecodePixelWidth或 将图像源的DecodePixelHeight值设置为所需的图像的高度和宽度。如果不这样做,应用程序将缓存图像,就像它被呈现为它的正常大小一样,而不是仅仅显示它的大小。

  • 为什么要使用base64字符串,为什么不使用二进制数据,即byte[]s?每个字符串的引用有多少副本?
票数 3
EN

Stack Overflow用户

发布于 2013-12-18 07:42:18

同意BitMap没有发布它的记忆(尝试和厌倦了记忆泄漏)。然而,尝试这个链接

阅读最后的评论可能是这样解决问题的解决办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20650055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档