2016-08-05 79 views
1

我试图在我的WPF应用程序中加载大约20张图像。只有第一张图片完全加载。其他图像部分加载。当我用断点来调试我试图加载每个图像后2秒,并运行良好。图像部分加载

代码

图像将被加载等,

foreach (string path in ImagesCollection) 
    { 
     DisplayImage = LoadImage(path); 
    } 

负载图像的方法,

MemoryStream mem; 

if (!string.IsNullOrEmpty(path) && (File.Exists(path))) 
    { 

     FileInfo ImageFile = new FileInfo(path); 
     ImageFile.Refresh(); 
     if (mem != null) 
      { 
       mem.Dispose(); 
      } 
     using (var stream = ImageFile.OpenRead()) 
      { 
       mem = new MemoryStream(); 

       stream.CopyTo(mem); 

      } 
     mem.Position = 0; 
     ImageFrame = BitmapFrame.Create(mem); 

    } 

截图:

enter image description here

我相信Dispose或新的实例使图像无法加载。请帮助。

+1

有你为什么不使用'BitmapFrame.Create(新的URI(路径))任何理由'没有所有的数据流复制? – Clemens

+0

@Clemens不,图像被加载到多个位置,并且MS Paint中还有一个编辑和保存功能。使用'新的Uri(路径)'抛出'访问冲突错误'?不确定。 – iamCR

+0

@HenkHolterman你可以请改革吗? – iamCR

回答

1

BitmapFrame.Create状态的文档

这意味着你的“bitmapStream只能当的OnLoad缓存选项用于创建框架后关闭。直到需要的框架默认的OnDemand缓存选项保留流”一旦将它传递给BitmapFrame,就不能重新使用MemoryStream。这是错误的来源。

效率只是通过FileStream。 加载图像方法

if (!string.IsNullOrEmpty(path) && (File.Exists(path))) 
{ 

    var stream = ImageFile.OpenRead()) 
    ImageFrame = BitmapFrame.Create(stream); 
} 
+0

当我尝试加载大小> 5Mb的图像文件时,经常会造成内存异常。 – iamCR

+0

然后我建议你将图像的FileStream传递给BitmapFrame.Create。通过将它读入MemoryStream中,您正在创建不必要的内存压力。 ImageFrame会为您缓存性能。 – PhillipH

+0

你可以请重构和发布代码? – iamCR