2012-12-11 64 views
4

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

一个

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; 
} 

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; 

我记得我从一个流中读取的地方,装载完全禁用缓存。如果这是真的,是否意味着从内存管理角度来看,从流中加载更好?

+0

您最终需要在case A中处理'fileStream'。 – usr

+1

你能用秒表来测量吗? – kenny

+0

@usr是的。代码已更新。 – Reyn

回答

1

据我了解,当您通过设置其UriSource属性加载BitmapImage时,图像总是被缓存。我不知道有什么办法可以避免这种情况。至少设置BitmapCreateOptions.IgnoreImageCache只能确保不从缓存中检索图像,但它不会阻止图像存储在缓存中。

BitmapCreateOptions“备注”说,

当选择IgnoreImageCache,在图像 缓存中的任何现有条目,即使它们共享相同的URI

我从这个结论所取代缓存是只有当一个图像被Uri加载时执行。换句话说,如果您确实需要禁止图像缓存,则必须通过其StreamSource属性加载图像。但是,如果这在内存管理方面真的“更好”,那么可能值得一个实验。你可以尝试两种选择,看看你是否观察到任何显着的内存消耗差异。

+0

这就是为什么我问这个问题。我已经尝试了两种方法,但没有看到太大的区别。但是,通过使用流而不是存储图像缓存的逻辑,我认为它应该在内存消耗方面更好 – Reyn

+1

如果您没有看到差异,则应始终选择“更容易”的解决方案,即使用较少代码的解决方案。我想这就是UriSource之一,因为你不需要处理Stream对象。 – Clemens