2012-03-25 6 views
1

イメージリストにSelectActiveFrameを使用してイメージフレームを追加しようとすると、メモリ不足例外が発生します。 174ページ未満で処理したが、これ以上のものはこのエラーが発生します。それは私のコードが最も簡単な形式です。OutOfMemoryExceptionイメージリストに多くのイメージフレームを追加する

var scannedImage = (Bitmap)Image.FromFile(@"C:\Users\rbl\Documents\Modelware\City Prop\TIFF Files\barcodememory.tiff"); 
var dim = new FrameDimension(scannedImage.FrameDimensionsList[0]); 
var imageCount = scannedImage.GetFrameCount(dim); 
var currentBatch = new List<Image>(); 

for (var i = 0; i < imageCount; i++) 
{ 
scannedImage.SelectActiveFrame(dim, i); 

currentBatch.Add(new Bitmap(scannedImage)); 
// Above experiences following error after +/- 174 pages 
//System.OutOfMemoryException was unhandled 
//Message=Out of memory. 
//Source=System.Drawing 
} 
+0

メモリの問題であるかどうかを確認するには、dimを取得して、そのサイズの200個の空のビットマップを作成します。明確にするために、 'var'を少し少なくしてください。 –

+0

これは、65%で動作する物理メモリとしてのメモリとは考えられません。 varsの私の使用をReSharperが推奨していたので、これは良い習慣ではないと聞いて面白かったです。ありがとう。私は実際にこれが良いとは思わない –

+0

TaskManを見ていない、いくつかのコードを実行します。 OOMは、LOHの断片化によって引き起こされる可能性があります。 –

答えて

0

メモリ不足です。画像を一括して読み込む必要があります(必要なものをロードし、必要なくなったらアンロードしてください)。

とにかく...なぜいくつかのビットマップが必要なのはわかりません。ちょうどnew Bitmap(...)を1回実行して、それを再利用してください(貼り付けたコードが実際のコードでなく、forループ内に複数のscannedImageを処理している場合を除きます)。

+0

ありがとうございます。私は自分の記憶を監視しましたが、これがなくなっているという兆候は見られません。物理メモリは65%で動作します。 「新しいBitmap(scannedImage)」を1回実行してから同じイメージを再利用することについては、毎回同じイメージを使用していないので、コードが正しいと思います。私は、毎回174ページの画像の新しいフレーム(SelectActiveFrame)を使用して、マルチページTIFFファイルを扱っています。 –

0

私は問題を解決するために、フレームをバイトストリームに変換し、次に画像に戻す。以下は100%です(理由がわからない、またはこれが良い解決策であるかどうかは分かりません)。

for (int i = 0; i < pageCount; i++) 
{ 
    image.SelectActiveFrame(dim, i); 
    var byteStream = new MemoryStream(); 
    image.Save(byteStream, ImageFormat.Bmp); 
    frames[i] = Image.FromStream(byteStream); 
} 
関連する問題