【问题标题】:Images loading partially图像部分加载
【发布时间】:2016-08-05 19:14:30
【问题描述】:

我正在尝试在我的 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);

     }

截图:

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

【问题讨论】:

  • 有什么理由不使用BitmapFrame.Create(new Uri(path)) 而不进行所有流复制?
  • @Clemens 不,图像在多个位置加载,MS paint 中还有一个编辑和保存功能。使用new Uri(path) 抛出Access violation error?不确定。
  • @HenkHolterman 你能改一下吗?
  • BitmapFrame.Create(stream) 异步加载,并且由于在加载完成之前超出范围,内存流将被销毁。一种方法是使用 OnLoad 缓存选项。 (而不是默认的 OnDemand)。使用 BitmapFrame.Create(mem, BitmapCreateOptions.None, BitmapCacheOptions.OnLoad)
  • @oreubens 当我尝试加载大小 >5Mb 的图像文件时,这会频繁地创建我 Out of memory exception

标签: c# wpf


【解决方案1】:

BitmapFrame.Create 的文档状态“只有在使用 OnLoad 缓存选项时才能在创建帧后关闭 bitmapStream。默认的 OnDemand 缓存选项会保留流直到需要帧”

这意味着一旦将 MemoryStream 传递给 BitmapFrame,就不能再使用它。这是错误的根源。

为了提高效率,只需传递 FileStream。 加载图片方法

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

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

【讨论】:

  • 当我尝试加载大小 >5Mb 的图像文件时,这会频繁地创建我 Out of memory exception
  • 那我建议你把图片的FileStream传给BitmapFrame.Create。通过将其读入 MemoryStream,您会造成不必要的内存压力。 ImageFrame 将为您缓存性能。
  • 不想关闭或处置流吗?这会在任何地方造成内存泄漏吗?或者可以在using 中使用BitmapFrame 吗?
  • 请查阅有关使用 BitmapFrame.Create() 的文档,以了解如何以及何时关闭传入的流。为了提高效率,BitmapFrame 不会立即读取您的流。跨度>
  • 谢谢,因为我在编辑图像时得到Sharing violation error,在加载时得到Out of memory exception,我对代码有点困惑。这个答案在保存图像期间给了我Sharing violation error
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 2021-12-04
  • 2023-03-09
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多