1

C#/ WPF / Windows 8 App Storeアプリを作成していて、いくつかのPNG/JPGを読み込んで表示しようとしています。画像はすべて適度に高解像度ですが、ファイルサイズは通常約200k程度です。問題は、BitmapImageクラス(私が見つけることができる唯一のクラス)を使用してそれらをロードすると、使用されるメモリの合計が数百メガに跳ね上がることです。私の知る限り、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で表示するには、画像データの生の1対1表現であるビットマップに解凍する必要があります。

解凍された画像データをメモリに保存しない場合、システムが表示のために画像を参照しようとするたびに、貴重なCPUリソースを使用して、画像を再度解凍する必要があります。PNGやJPGのような一般的な形式の場合、圧縮と解凍のプロセスはかなり複雑です。

動的解凍用に設計された画像圧縮形式があります。ただし、DXT1-5などのこれらの形式は、通常、3Dライブラリでのみサポートされます。(詳細はこちら

于 2013-03-21T02:07:46.093 に答える