c# - 有没有办法防止 png/jpg 图像被转换为​​位图图像

标签 c# windows-8

我正在制作一个 C#/WPF/Windows 8 应用商店应用程序,我正在尝试加载一些 PNG/JPG 以在 View 中显示它们。这些图像的分辨率都相当高,但文件大小通常只有 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);
  }
}

最佳答案

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

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

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

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

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

关于c# - 有没有办法防止 png/jpg 图像被转换为​​位图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537901/

相关文章:

visual-c++ - 使用 Visual C++ 在 Windows 应用商店应用程序中使用 OpenCV

javascript - 使用共享合约使用图像文件

c# - string.Length 与 string.ToCharArray().Length

c# - 将控件的属性保存到 xml

c# - 我如何解释此 C# 堆栈跟踪?零行错误

c# - Unity 3D 中的 MonoBehaviour 是什么?

javascript - Windows 8 应用程序是否在符合标准的 JavaScript、HTML5 和 CSS3 上运行?

c# - 带有 Html 和 C# 的 Metro 风格应用程序

.net - Windows 运行时 : Does it include a logging library?

c# - 使用 JsonConvert 进行序列化会丢失数据