2016-08-05 6 views
1

WPFアプリケーションに約20枚の画像をロードしようとしています。最初の画像だけが完全に読み込まれます。他の画像は部分的に読み込まれています。デバッグにブレークポイントを使用すると、2秒後に各イメージを読み込もうとしましたが、うまくいきました。部分的にロードされている画像

コード

イメージは以下のようにロードされます 、

foreach (string path in ImagesCollection) 
    { 
     DisplayImage = LoadImage(path); 
    } 

の画像を取り込み方法、

MemoryStream mem; 

if (!string.IsNullOrEmpty(path) && (File.Exists(path))) 
    { 

     FileInfo ImageFile = new FileInfo(path); 
     ImageFile.Refresh(); 
     if (mem != null) 
      { 
       mem.Dispose(); 
      } 
     using (var stream = ImageFile.OpenRead()) 
      { 
       mem = new MemoryStream(); 

       stream.CopyTo(mem); 

      } 
     mem.Position = 0; 
     ImageFrame = BitmapFrame.Create(mem); 

    } 

スクリーンショット:

enter image description here

私はDisposeと考えています。新しいインスタンスがイメージを読み込まないと思います。親切に助けてください。

は、これはあなたを意味

+1

あなたはすべてのストリームをコピーせずに '' BitmapFrame.Create(新しいウリ(パスを))使用していない理由は、何らかの理由はありますか? – Clemens

+0

@クレメンスいいえ、イメージは複数の場所に読み込まれ、MSペイントには編集と保存の機能もあります。 '新しいUri(パス)'を使用すると 'アクセス違反エラー'がスローされますか?わからない。 – iamCR

+0

@HenkHoltermanそれを改革していただけますか? – iamCR

答えて

1

BitmapFrame.Create状態のドキュメントは、「フレームが必要になるまでフレームのみのOnLoadキャッシュオプションを使用するときに作成された後bitmapStreamを閉じることができます。デフォルトのオンデマンドキャッシュオプションは、ストリームを保持します」 BitmapFrameに渡した後でMemoryStreamを再利用することはできません。これがエラーの原因です。

効率を上げるにはFileStreamを渡します。 の画像を取り込み方法

if (!string.IsNullOrEmpty(path) && (File.Exists(path))) 
{ 

    var stream = ImageFile.OpenRead()) 
    ImageFrame = BitmapFrame.Create(stream); 
} 
+0

サイズが5MBを超えるイメージファイルをロードしようとすると、これは頻繁に「メモリ不足例外」を発生させます。 – iamCR

+0

次に、イメージのFileStreamをBitmapFrame.Createに渡すことをお勧めします。それをMemoryStreamに読み込むことで、不必要なメモリ圧迫を引き起こしています。あなたのために、ImageFrameはキャッシュします。 – PhillipH

+0

コードを書き換えてコードとして投稿できますか? – iamCR

関連する問題