2012-03-25 3 views
1

SelectActiveFrame을 사용하여 이미지 목록에 이미지 프레임을 추가하려고하면 메모리 부족 예외가 발생합니다. 174 페이지 미만으로 처리하면이 모든 오류가 발생하므로 100 %는 모두 작동합니다. 내 코드가 가장 간단한 형태입니다.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

메모리 문제인지 확인하려면 희미 해져서 그 크기의 200 비트 맵을 생성하십시오. 그리고 명확성을 위해,'var'를 조금 덜 사용하십시오. –

+0

실제 메모리가 65 %로 실행되는 메모리라고 생각하지 마십시오. vars에 대한 나의 재사용, ReSharper가 추천 한 것은 이것이 좋은 습관이 아니라는 것을 듣기에 재미 있습니다. 감사. 나는 이것이 실제로 좋지 않다는 것을 실제로 의심했다. –

+0

TaskMan을 보지 말고, 어떤 코드를 실행하라. OOM은 LOH의 단편화로 인해 발생할 수 있습니다. –

답변

0

메모리가 부족합니다. 일괄 처리로 이미지를로드해야합니다 (필요에 따라로드하고로드 할 필요가 없어 짐).

어쨌든 ... 왜 여러 비트 맵이 필요한지 알 수 없습니다. 단지 new Bitmap(...)을 한 번 사용한 다음 다시 사용하십시오. 붙여 넣은 코드가 실제 코드가 아니고 for 루프 내에 여러 개의 scannedImage을 처리하지 않는 한.

+0

감사합니다. 나는 내 기억을 모니터했지만 이것이 부족하다는 징후는 보이지 않는다. 실제 메모리가 65 %로 실행됩니다. "새로운 비트 맵 (scannedImage)"을 한 번 사용한 다음 동일한 이미지를 다시 사용하는 것과 관련하여 매번 동일한 이미지를 사용하지 않으므로 코드가 정확하다고 생각합니다. 매번 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); 
} 
관련 문제