我正在制作一个 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 应用程序中的内存使用量,您可以尝试几个选项。
不要将图像缓存在内存中,或选择最佳时间 使用
BitmapCacheOption
加载图像,例如:bitmap.CacheOption = BitmapCacheOption.None
这将根据需要从磁盘填充图像,如果图像只有 200k,性能下降应该不会太糟糕,但不会像缓存一样快确保您渲染的图像没有超出需要的大小,如果 您显示图像的
Element
是 200x200 并且图像 是 1024x768 您可以设置DecodePixelWidth
,这将创建Bitmap
为您定义的大小,而不是其实际大小。 例如:bitmap.DecodePixelWidth = 200
关于c# - 有没有办法防止 png/jpg 图像被转换为位图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537901/