2016-03-25 22 views
0

Ich habe eine Frage, ob dies möglich ist oder nicht. Ich möchte eine for-Schleife verwenden, um eine Bitmap zu generieren, etwas zu dieser Bitmap zu tun und es dann in einem List<Bitmap> zu speichern.C# Bitmap-Liste Flushing

Ich verstehe, dass Bitmaps speicherintensiv sein können, also habe ich darüber nachgedacht, die Bitmap zu entsorgen, nachdem ich sie der Liste hinzugefügt habe. Hier ist mein Code:

List<Bitmap> listOfBitMaps = new List<Bitmap>(); 

foreach (string thingImLooping in ThingImLoopingThrough) 
{ 
    Bitmap bmp = new Bitmap(1250, 1250); 

    // do stuff to bitmap 
    listofBitMaps.Add(bmp); 
    bmp.Dispose(); 
} 

Nach diesem Code, I-Code, der durch jede Bitmap-Loops und druckt es, aber die Bitmaps sind nicht in der Liste?

Wie kann ich in diesem Fall kein Gedächtnisschwein sein?

Vielen Dank!

Antwort

0

Sie können die BitMaps auch in Byte [] konvertieren, wenn Sie sie speichern möchten. Das wird potenzielle Speicherlecks beseitigen. Sie können sie auch in Base64-Zeichenfolgen konvertieren, die häufig im HTML-Format verwendet werden.

List<byte[]> listOfBitMaps = new List<byte[]>(); 

foreach (string thingImLooping in ThingImLoopingThrough) 
{ 
    using (Bitmap bmp = new Bitmap(1250, 1250)) 
    { 

     // do stuff to bitmap 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
      listofBitMaps.Add(stream.ToArray()); 
     } 
    } 
} 
0

Sie müssen die Bitmaps im Speicher halten, bis Sie keine verwenden für sie verwenden. Wenn Sie nur wieder die gleichen Bitmaps verwenden wollen, können Sie stattdessen eine using Anweisung verwenden, um jede Bitmap zu verarbeiten, da es wie

using(Bitmap bmp = new Bitmap(1250, 1250)) { 
    //Do stuff to bitmap 
    //Print bitmap 
} // bmp is automatically disposed after this block ends 

Die using Anweisung erzeugt wird, wird automatisch die Bitmap entsorgen, nachdem es mit getan wurde, . Wenn Sie jedoch benötigen, um die Bitmaps in einer Liste zu speichern, haben Sie keine andere Wahl, als sie nach zu entsorgen, was auch immer Sie mit ihnen arbeiten.

List<Bitmap> listOfBitMaps = new List<Bitmap>(); 

foreach (string thingImLooping in ThingImLoopingThrough) 
{ 
    Bitmap bmp = new Bitmap(1250, 1250); 
    //Do stuff to bitmap 
    listofBitMaps.Add(bmp); 
} 

foreach (var bmp in listOfBitMaps) 
{ 
    // Print, process, do whatever to bmp 
    bmp.Dispose(); 
}