前言
图片我们可能是这样加载的
1 | <Image Source="{Binding Pic}" Stretch="Fill"> |
这种方式适合加载程序自身的图片。
但是不建议加载新生成的图片,比如截屏。
因为这样加载一方面图片的内存释放会有问题,容易导致内存泄漏,另一方面,被加载的图片就会处于占用状态,如果此时我们要处理图片比如压缩上传,就会因占用而报错。
正由另一进程使用,因此该进程无法访问此文件。
WPF列表中加载
添加一个转换器
1 | using System; |
原来加载的地方改为
1 | <Window xmlns:cv="clr-namespace:SchoolClient.Converters"> |
代码中加载
上面说的是在WPF中使用转换器来把图片加载到内存中的方式,当然我们也可以在代码中加载。
工具类
1 | using System; |
调用
1 | UserHeadImage.Source = ZImageUtils.GetImage(pic); |
释放
1 | UserHeadImage.Source = null; |
注意
如果 StreamSource 和 UriSource 均设置,则忽略 StreamSource 值。
要在创建 BitmapImage 后关闭流,请将 CacheOption 属性设置为 BitmapCacheOption.OnLoad。
默认 OnDemand 缓存选项保留对流的访问,直至需要位图并且垃圾回收器执行清理为止。
下面的这种方式会导致内存泄漏
如果在针对图片很大的情况下,或者频繁的调用体积很大的图片,直接引用地址,很可能就会造成内存溢出的问题。
1 | Uri uri = new Uri(ImageSavePath, UriKind.Absolute); |
使用Image控件显示图片后,虽然自己释放了图片资源,Image.Source = null
了一下,但是图片实际没有释放。