1

我正在制作一个 C#/WPF/Windows 8 App Store 应用程序,我正在尝试加载一些 PNG/JPG 以在视图中显示它们。这些图像的分辨率都相当高,但文件大小通常只有 200k 左右。问题是,当我使用 BitmapImage 类(这是我能找到的唯一一个)加载它们时,使用的总内存会上升到 100 兆。据我所知,它采用 png/jpb 并将其转换为位图图像,这大大增加了内存使用量。到目前为止,我还没有找到解决此问题的方法,尽管似乎应该有一个简单的解决方案。

有什么很明显的我想念的吗?

我的代码如下

private async Task TestFunction(IReadOnlyList<StorageFile> files)
{
  var images = new ObservableCollection<Image>();
  imagePanel.ItemsSource = coverImages;
  foreach (var file in files)
  {

    var bitmap = new BitmapImage();
    var item = await file.OpenAsync(FileAccessMode.Read);
    bitmap.SetSource(item);
    var image = new Image();
    image.Source = bitmap;
    image.Height = 200;

    images.Add(image);
  }
}
4

2 回答 2

7

如果磁盘上的图像是压缩格式(并且大多数图像文件格式使用某种形式的压缩),内存占用会更大。

如果图像大小为 100x100 像素并使用 8 位颜色深度,则该图像的原始数据将占用 100x100=10,000 字节,这就是必须呈现到屏幕上的数据量。

如果您正在寻找一种方法来减少 WPF 应用程序中的内存使用,您可以尝试一些选项。

  1. 不要将图像缓存在内存中,或者选择加载图像的最佳时间,使用BitmapCacheOption例如:bitmap.CacheOption = BitmapCacheOption.None 这将根据需要从磁盘填充图像,如果图像只有 200k,性能下降应该不会太糟糕,但它不会像缓存一样快

  2. 确保您渲染的图像不会比他们需要的大,如果Element您要显示的图像是 200x200 并且图像是 1024x768,您可以设置DecodePixelWidth,这将创建 Bitmap您定义的大小而不是实际大小。例如:bitmap.DecodePixelWidth = 200

于 2013-03-21T02:06:30.480 回答
3

PNG、JPG 和所有其他形式的图像压缩仅用于存储。为了在 WPF 中显示压缩的图像内容,您必须将其解压缩为位图,这是图像数据的原始一对一表示。

如果您不将解压后的图像数据存储在内存中,那么每次系统尝试引用图像进行显示时,都必须再次解压图像,使用宝贵的 CPU 资源。对于PNG或JPG等流行格式,压缩和解压缩过程相当复杂。

有一些图像压缩格式是为动态解压缩而设计的。但是,这些格式(例如 DXT1-5)通常仅受 3D 库支持。(更多信息在这里

于 2013-03-21T02:07:46.093 回答