【问题标题】:WPF and Very Large ImagesWPF 和非常大的图像
【发布时间】:2023-03-08 17:32:01
【问题描述】:

我能做些什么来帮助管理 WPF 用于渲染巨大图像的大量内存 - 可能高达 10,000 x 10,000?

我需要保持质量,因为缩放是关键,但加载图像控件似乎需要 50 - 700MB 的内存使用量:S

目前我在加载图像方面没有做任何特别聪明的事情:

BitmapImage imageSource = new BitmapImage();
imageSource.BeginInit();
imageSource.UriSource = new Uri(imageUrl, UriKind.Absolute);
imageSource.CacheOption = BitmapCacheOption.OnLoad;
imageSource.EndInit();

image.Source = imageSource;

【问题讨论】:

    标签: wpf image


    【解决方案1】:

    您可以使用BitmapImage.DecodePixelHeightBitmapImage.DecodePixelWidth 以针对对话框大小优化的较低质量渲染图像。在 XAML 中它看起来像这样:

    <Image>
        <Image.Source>
            <BitmapImage UriSource="http://server/image.jpg" DecodePixelWidth="400" />
        </Image.Source>
    </Image>
    

    【讨论】:

      【解决方案2】:

      因此,网络堆栈似乎存在一些内存泄漏/问题,因为将图像下载到本地磁盘然后加载似乎将内存使用量减少了约 40%。

      我所做的只是将图像复制到临时目录 System.IO.Path.GetTempPath(),然后从那里加载它们。如果您在 DataGrid 中的集合中有大量对象,那么使用 VirtualizingStackPanel 可能也值得:

      <DataGrid VirtualizingStackPanel.IsVirtualizing="True" 
           VirtualizingStackPanel.VirtualizationMode="Recycling">
      </DataGrid>
      

      我现在已经阅读了许多证实这一点的博客。我还使用 Jakob 提到的 DecodePixelWidth/Height 进行了延迟加载,但很高兴找到了一种加载完整质量图像的方法,并且内存占用要小得多:)

      【讨论】:

      • 您能分享一下您的解决方案吗?我有点同样的问题。当我第一次加载 DataGrid 时,滚动真的很慢,有时它会抛出 OutOfMemoryException。不过,在第二次加载 DataGrid 之后,它似乎工作正常。
      【解决方案3】:

      你也可以试试 CacheMode 的方式。

      缓存模式方式以 2048x2048 的最大分辨率创建控件的位图版本。 CacheMode 还将缓存的位图加载到视频内存中。您可以选择设置缓存行为。 要使用它,只需在图像 xaml 定义中设置 CacheMode 属性,如下所示:

      <Image Source="...">
          <Image.CacheMode>
              <BitmapCache ... />
          </Image.CacheMode>
      </Image>
      

      HTH 洛伦佐

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        相关资源
        最近更新 更多