2012-02-11 7 views
0

私は単純な画像サイズ変更プログラムを書いています。複数のファイルを.exeにドラッグすると、各ファイルが移動され、サイズが変更されます。これは、OOM(メモリ不足)例外がスローされている特定のポイントまで動作します。私はビットマップでDisposeを呼び出してNullに設定しようとしましたが、どちらも何もしていないようです。どのようにC#でオブジェクトから同じメモリを再利用しますか? (ビットマップ特に)

Bitmap current_image; 
for (int i = 0; i < imagesfilepath.Count; ++i) 
     { 
      // Load the image. 
      if (current_image != Null) 
      { 
       current_image.Dispose(); 
       current_image = Null; 
      } 
      current_image = (Bitmap)Image.FromFile(imagesfilepath[i], true); 

      // Resize it. 
      // Save it. 
     } 

例外は、通常1.5GBを使用した後にスローされます。ユーザーが一度にサイズを変更できるイメージの量を制限することでこの問題を回避することができますが、1つのBitmapにメモリを割り当てて繰り返し使う必要はありませんか?

+0

保存するコードとリソースの解放方法を表示できますか? – BrokenGlass

+0

私たちは本当にここでもっとコードを見る必要があると思います。そこにあるものから、その例外を経験すべきではありません。 –

答えて

3

Image.FromFile()は、ファイルが有効なイメージでないときでOutOfMemoryExceptionをスロー:

例外条件 でOutOfMemoryException
ファイルが有効なイメージ形式を持っていません。 -or- GDI +は、ファイルのピクセル形式をサポートしていません。

はい、これは意味をなさないし、混乱しますが、それはそのとおりです。

MSDN:Image.FromFile

+0

すべてのファイルはまったく同じです。それぞれ1.02 MBであり、そのうち73個を74、またはそれ以上の大きさでサイズ変更できます。 System.Drawing.dllで 'System.OutOfMemoryException'タイプの未処理の例外が発生しました。 追加情報:メモリ不足です。 – user1203277

+1

例外をキャッチしてみてください。あなたが本当に記憶に残っていない場合は、それをキャッチしても何の効果もありません - あなたは記憶がありません。一方、GDI +エラーが発生している場合、ループは続行されます。 –

0

限り、あなたは画像の処分として、あなたがのOutOfMemoryExceptionを受け取るべきではありません。次のスニペットでテストしました。このスニペットでは、プログラムの処理が正常に終了し、例外が発生しなかった場合に例外が発生しました。

var path = @"C:\Users\mdearing\Desktop\Untitled.bmp"; 
for (var i = 0; i < 1000; i++) 
{ 
    var image = Bitmap.FromFile(path); 
    //image.Dispose(); //commenting this line out causes the OOM Exception 
} 
1

メモリが不足しているのは、メモリのセグメンテーション、必要なサイズの連続したメモリブロックがないことが原因です。むしろそれを避けるために同じバッファを使うべきです。

関連する問題