【问题标题】:WPF The Most Efficient Way of Loading ImageWPF 最高效的图片加载方式
【发布时间】:2012-11-28 21:16:36
【问题描述】:

这听起来可能很愚蠢,但是哪一种是最有效的加载图像的方法?

一个

BitmapImage bmp = new BitmapImage();
using(FileStream fileStream = new FileStream(source_path, FileMode.Open))
{
   bmp.BeginInit();
   bmp.CacheOption = BitmapCacheOption.OnLoad;
   bmp.StreamSource = fileStream;
   bmp.EndInit();
   if (bmp.CanFreeze)
      bmp.Freeze();

   images.source = bmp;
}

B

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
bmp.UriSource = new Uri(source_path);
bmp.EndInit();
if (bmp.CanFreeze)
   bmp.Freeze();

images.Source = bmp;

我记得我在某处读到,从流中加载会完全禁用缓存。如果这是真的,这是否意味着从流中加载在内存管理方面更好?

【问题讨论】:

  • 您最终需要处理fileStream,以防万一。
  • 你能用秒表测量吗?
  • @usr 是的。代码已更新。
  • @Reyn 在using 语句中实例化fileStream 比显式处理它更安全。

标签: wpf image performance


【解决方案1】:

据我了解,当您通过设置其UriSource 属性来加载 BitmapImage 时,图像始终会被缓存。我不知道有什么办法可以避免这种情况。至少设置BitmapCreateOptions.IgnoreImageCache只保证不从缓存中取回图片,但不阻止图片保存在缓存中。

BitmapCreateOptions 中的“备注”是这么说的

选择ignoreimageCache时,图像中的任何现有条目 即使共享相同的 Uri,也会替换缓存

我由此得出的结论是,在通过 Uri 加载图像时执行缓存。换句话说,如果您真的需要禁止图像缓存,则必须通过其StreamSource 属性加载图像。

但是,如果这真的“在内存管理方面更好”,也许值得一试。您可以尝试两种替代方案,看看是否发现内存消耗有任何显着差异。

【讨论】:

  • 这就是我问这个问题的原因。这两种方法我都试过了,但没有看到太大的区别。但是,根据使用流而不是存储图像缓存的逻辑,我认为在内存消耗方面应该更好
  • 如果您没有发现差异,您应该始终选择“更简单”的解决方案,即代码更少的解决方案。我猜这是 UriSource 之一,因为您不需要处理 Stream 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多