2012-03-25 7 views
1

Beim Versuch, Bildrahmen mit SelectActiveFrame zu einer Bildliste hinzuzufügen, erhalte ich eine Ausnahme wegen zu wenig Speicher. Alles funktioniert 100%, wenn ich weniger als 174 Seiten bearbeite, aber irgendetwas darüber hinaus erzeugt diesen Fehler. In seiner einfachsten Form ist mein Code;OutOfMemoryException Hinzufügen vieler Bilderrahmen zur Bilderliste

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

Um zu überprüfen, ob es ein Speicherproblem ist, einfach die Dim und erstellen 200 leere Bitmaps dieser Größe. Und verwende zur Klarheit ein bisschen weniger 'var'. –

+0

Glauben Sie nicht, dass dies Speicher ist, da der physische Speicher bei 65% läuft. Zu meiner Verwendung von Vars wurden sie von ReSharper so interessant empfohlen zu hören, dass dies keine gute Übung ist. Vielen Dank. Ich vermutete, dass dies nicht gut ist –

+0

Schauen Sie nicht auf TaskMan, führen Sie etwas Code. OOM kann durch Fragmentierung der LOH verursacht werden. –

Antwort

0

Sie haben keinen Speicher mehr. Sie müssen die Bilder in Stapeln laden (laden Sie einfach, was Sie brauchen, und entladen Sie es, wie Sie es nicht mehr brauchen.)

Wie auch immer ... Ich sehe nicht, warum Sie mehrere Bitmaps benötigen. Tun Sie einfach new Bitmap(...) einmal und wiederverwenden Sie es (es sei denn, der Code, den Sie eingefügt haben, ist nicht Ihr echter Code und Sie bearbeiten mehrere scannedImage innerhalb dieser for-Schleife.)

+0

Danke. Ich habe mein Gedächtnis überwacht, sehe aber keinen Hinweis darauf, dass es knapp wird. Der physische Speicher wird zu 65% ausgeführt. In Bezug auf "neue Bitmap (gescannte Bild)" einmal und dann wieder das gleiche Bild verwenden - ich glaube, dass mein Code korrekt ist, da ich nicht jedes Mal das gleiche Bild verwenden. Ich arbeite mit einer mehrseitigen TIFF-Datei, die jedes Mal einen neuen Rahmen (SelectActiveFrame) des 174 Seitenbildes verwendet. –

0

Es ist interessant, dass ich in der Lage bin, mein Problem zu lösen Frame zu einem Bytestream und dann zurück zu einem Bild. Folgendes funktioniert 100% (nur nicht sicher warum, oder ob das eine gute Lösung ist).