2016-05-29 66 views
-1

在這裏沒有結果的一個代碼段:使用BITMAP

Dim BMf As Bitmap 
BMf = New Bitmap(PicBox.Width, PicBox.Height) 
Call FourierPlot(PlotHeight, PlotWidth, RPMArray, CoefArray, Count, 2, BMf) 
Me.PicBox.Image = BMf 
BMf.Dispose() 

子程序內是這樣的代碼:

Dim myGraphics As Graphics = Graphics.FromImage(BMf) 
Dim myPen As New Pen(colr) 
.... 
myGraphics.DrawLine(myPen, lastx, lasty, temp1, temp2) 
.... 
myPen.Dispose() 
myGraphics.Dispose() 

顯示的PicBox由具有線的邊界矩形的從對角繪製(什麼我認爲是一個「錯誤圖像。)

任何建議(希望非常簡單的),我做錯了什麼?

+1

你得到了Dispose()回調。你應該處理*舊*圖像,而不是新的。因此,在分配Image屬性之前使用'If Me.PicBox.Image IsNot Nothing Then Me.PicBox.Image.Dispose()'。 –

回答

0

您不應該致電BMf.Dispose(),因爲圖像將被圖片框使用。

更新:

OK,小更新,因爲這似乎是混亂的OP和其他人。

當你說Me.PicBox.Image = BMf你設置一個位圖的引用。 BMfPicBox.Image現在指向相同的對象。因此,你不應該處理它,因爲那樣它就不能再被使用了。再次 - 這不是一個副本,這是同一個對象。

關於泄漏。刪除此行不會導致任何內存或其他泄漏。 .NET正在爲你管理這個。只要不需要位圖(這意味着沒有人引用它=您的圖片框將加載另一個圖像),它將不需要,並在垃圾回收器的下一次運行時處理。這是自動的。

如果您真的需要關心資源,可能需要手動處理它,例如,如果您經常調用您的代碼並創建新的位圖,那麼很多次。但是在這種情況下,您可能會更好地強制垃圾收集器在某些地方運行,這會對用戶造成一些延遲。你可以這樣做:

GC.Collect() 
+1

那他應該做什麼?你的回答不完整。 –

+0

他應該刪除這一行,這是相當明顯的? – Arek

+0

「指向」我的指針的行爲使我挺直了。再次感謝您的幫助。 – GKMatthew