2016-03-25 36 views
0

我有一個問題,這是否可能。我想使用for循環來生成位圖,對該位圖執行某些操作,然後將其存儲在List<Bitmap>中。C#位圖列表Flushing

我知道位圖可能會佔用大量內存,因此我在考慮將位圖添加到列表後考慮處理位圖。這裏是我的代碼:

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(); 
} 

此代碼後,我有過每個位循環並打印的代碼,但位圖不在列表中?

在這種情況下,我怎麼能不成爲記憶豬?

謝謝!

回答

0

如果要存儲它們,也可以將BitMaps轉換爲byte []。這將擺脫潛在的內存泄漏。您也可以考慮將它們轉換爲Base64字符串,這通常與HTML格式一起使用。

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

您必須將位圖保留在內存中,直到您有沒有用於它們。如果你只是要再次使用所有相同的位圖,你也可以使用一個using語句來處理每一個位圖,因爲它像

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

using語句生成會自動處理位圖已經與完成後, 。但是,如果需要將位圖存儲在列表中,則您無權選擇,只能在之後處理它們完成與您的任何工作。

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(); 
}