0

さまざまな方法で変更する必要がある 400 以上の画像のセットを使用しています。最後に、ほぼ 1500 枚の画像が必要です。それらがすべて512 * 512pxであるとしましょう

最初にこの変更を適用して 1500 個の画像を取得し、このすべての画像をリストに保持して、アプリケーションですばやくアクセスできるようにしたい (読み込み時間なしで画像を切り替えられるようにしたい)

変更を適用するには、WriteableBitmapEx を使用します。

それを変更できるようにするには、この画像を WriteableBitmap にレンダリングする必要があり、OutOfMemoryException が発生します。

これが私がやっていることの簡単な例です:

        List<WriteableBitmap> myList = new List<WriteableBitmap>();

        foreach (var image in mySetOfImages) // iterating on my set of 400+ images
        {
            WriteableBitmap source = image.RenderImage().As<WriteableBitmap>();

            WriteableBitmap dest1 = BitmapFactory.New(512, 512);
            WriteableBitmap dest2 = BitmapFactory.New(512, 512);

            [...] // Some lines modifying dest1 and dest2 using source

            myList.Add(dest1);
            myList.Add(dest2);
        }

私はこの例外についてよく読みました。追加できることを読みました

GC.Collect();

私の「foreach」内にあるかもしれませんが、これはロードに時間がかかると思います。

私が読んだことは、私が正しい方法で行っていないのではないか、別の方法を考えるべきだとも思いました. だからここに投稿しているのですが、何かヒントはありますか?

4

1 に答える 1

0

基本的に、32 ビットの .NET プロセスでは、メモリに 2GB を超えるデータを格納することはできません。指摘したように、これはガベージ コレクター (GC) の問題ではありませんList<T>。. ガベージ コレクターは、各イメージにメモリを割り当て、「負荷がかかる」と、参照されなくなったオブジェクトを見つけて解放しようとします。ただし、リストに追加するだけのように見えるため、プレッシャーは高まるばかりです:-(

私が見る限り、2 つの選択肢があります。

  1. 各画像に割り当てる必要があるメモリの量を減らす方法を見つけてください。最も明白なのは、サイズを縮小することです。たとえば、サムネイルのみをキャッシュします。2 つ目は、ソース イメージごとに 2 つのイメージをキャッシュしないことです。
  2. 要求された場合にのみ画像を遅延ロードするようにし、使用されていない (表示されていない) 画像をリストから削除する可能性があります。これで、リストなどをスクロールするための独自の WPF ビジュアライゼーション コードを作成できます。
于 2016-02-11T05:38:06.157 に答える