Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法防止png/jpg图像转换为位图图像_C#_Windows 8 - Fatal编程技术网

C# 有没有办法防止png/jpg图像转换为位图图像

C# 有没有办法防止png/jpg图像转换为位图图像,c#,windows-8,C#,Windows 8,我正在制作一个C#/WPF/windows8应用商店应用程序,我正在尝试加载一些png/jpg以在视图中显示它们。这些图像都具有相当高的分辨率,但文件大小通常只有200k左右。问题是,当我使用BitmapImage类(这是我能找到的唯一一个)加载它们时,使用的总内存会跃升到100兆。据我所知,它使用png/jpb并将其转换为位图图像,这大大增加了内存使用。到目前为止,我还没有找到解决这个问题的方法,尽管看起来应该有一个简单的解决方案 我真的错过了什么吗 下面是我的代码 private async

我正在制作一个C#/WPF/windows8应用商店应用程序,我正在尝试加载一些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);
  }
}
private async Task TestFunction(IReadOnlyList文件)
{
var images=新的ObservableCollection();
imagePanel.ItemsSource=封面图片;
foreach(文件中的var文件)
{
var bitmap=新的位图();
var item=await file.OpenAsync(FileAccessMode.Read);
位图.SetSource(项);
var image=新图像();
image.Source=位图;
图像。高度=200;
图片。添加(图片);
}
}

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

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

如果您正在寻找减少WPF应用程序内存使用的方法,您可以尝试以下几种方法

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

  • 如果需要,请确保渲染的图像不超过需要的大小 您在其上显示图像的
    元素是200x200,图像
    是1024x768,您可以设置
    解码像素宽度
    ,这将创建
    位图
    为您定义的大小,而不是其实际大小。 e、 g:
    bitmap.DecodePixelWidth=200


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

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

    如果您正在寻找减少WPF应用程序内存使用的方法,您可以尝试以下几种方法

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

  • 如果需要,请确保渲染的图像不超过需要的大小 您在其上显示图像的
    元素是200x200,图像
    是1024x768,您可以设置
    解码像素宽度
    ,这将创建
    位图
    为您定义的大小,而不是其实际大小。 e、 g:
    bitmap.DecodePixelWidth=200


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

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


    有一些图像压缩格式是为动态解压缩而设计的。但是,这些格式(如DXT1-5)通常仅由三维库支持。()

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

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


    有一些图像压缩格式是为动态解压缩而设计的。但是,这些格式(如DXT1-5)通常仅由三维库支持。()

    对不起,没办法了。您必须先解压缩图像,然后才能显示它。如果您担心内存使用问题,请尝试不缓存图像。
    bitmap.CacheOption=BitmapCacheOption。无
    抱歉,无法解决此问题。在显示图像之前,必须先解压缩图像。如果担心内存使用,请尝试不缓存图像。CacheOption=BitmapCacheOption。无
    我最终使用了DecodePixelHeight,这很好地满足了我的需要。使用winRT,您不再有缓存选项,只有创建选项,并且您只有两个选择,不从缓存加载,则无。我最终使用了DecodePixelHeight,这很好地满足了我的需要,使用winRT,您不再有缓存选项,只有创建选项,在这里,您只有两个选择,不从缓存加载,以及无。