我有一个非常简单的 WPF 应用程序,用于预览任何给定文件夹中的图像,一次一张图像。您可以将其视为 Windows Image Viewer 的克隆。该应用程序有一个 PreviewKeyUp 事件,用于在按下左箭头或右箭头键时加载文件夹中的上一张或下一张图像。
<Grid>
<Image x:Name="CurrentImage" />
</Grid>
private void Window_PreviewKeyUp(object sender, KeyEventArgs e)
{
switch (e.Key)
{
case Key.Left:
DecreaseIndex();
break;
case Key.Right:
IncreaseIndex();
break;
}
var currentFile = GetCurrentFile();
CurrentImage.Source = new BitmapImage(new Uri(currentFile));
}
我试图解决的问题是,加载多个图像时会出现大量内存膨胀,直到发生垃圾收集。您可以在我拍摄的应用程序内存使用情况的屏幕截图中看到这一点。在垃圾回收发生之前,其大小超过 300 MB 的情况并不少见。
我尝试将图像包装在 using 语句中,但这不起作用,因为 BitmapImage 没有实现 IDisposable。
using (var image = new BitmapImage(new Uri(currentFile)))
{
CurrentImage.Source = image;
}
将多个图像加载到应用程序中时,如何防止内存膨胀?
当您说预览时,您可能不需要完整的图像尺寸。所以除了打电话Freeze
,您还可以设置 BitmapImage 的DecodePixelWidth
or DecodePixelHeight
财产。
我还建议直接从FileStream
而不是Uri
。请注意,在线文档UriCachePolicy说它是
...表示来自 HTTP 源的图像的缓存策略的值。
因此它可能不适用于本地文件 Uris。
为了安全起见,你可以这样做:
var image = new BitmapImage();
using (var stream = new FileStream(currentFile, FileMode.Open, FileAccess.Read))
{
image.BeginInit();
image.DecodePixelWidth = 100;
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream;
image.EndInit();
}
image.Freeze();
CurrentImage.Source = image;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)