2013-07-02 100 views
0

我捕捉屏幕,然後將圖像數據保存到內存流,以便我可以將其設置爲BitmapImage對象。C#WPF處理圖像對象

bmp = new System.Drawing.Bitmap((int)sel.rectSelectedArea.Width, (int)sel.rectSelectedArea.Height); 
bounds = new System.Drawing.Rectangle((int)sel.rectSelectedArea.X, (int)sel.rectSelectedArea.Y, (int)sel.rectSelectedArea.Width, (int)sel.rectSelectedArea.Height); 

using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp)) 
    g.CopyFromScreen(new System.Drawing.Point(bounds.Left, bounds.Top), System.Drawing.Point.Empty, bounds.Size); 

ms = new MemoryStream(); 
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
ms.Position = 0; 

frames.Add(new BitmapImage()); 
frames.Last().BeginInit(); 
frames.Last().StreamSource = ms; 
frames.Last().EndInit(); 
frames.Last().Freeze(); 

然後,當我需要顯示該框架給用戶。我將選定的幀設置爲圖像對象的來源。

imgExample.Source = frames[targetFrame]; 

問題是當我向用戶顯示另一幀時。前一幀保留在內存中,所以在大約200幀之後,它會消耗從未釋放的3-600,000 K的內存。

有沒有一種方法讓imgExample(Image對象)立即釋放內存? 或者是否有覆蓋相同內存的方法,而不是爲所有幀創建新對象。

+1

我愛你帶來的恐龍'System.Drawing'東西到WPF的方式。 –

+0

你可以嘗試一個WriteableBitmap - 這些很容易更新,只要你喜歡。 – Chris

回答

0
bmp.Dispose(); 
bmp = null; 

GC.Collect(); 
+0

我需要保留用於顯示框架的BMP,但是我不需要將它顯示在內存中。 – John

+0

所以,你想保持BMP ...但不是在內存中?說,通過寫入磁盤? –