我正在使用計時器和圖片框顯示影像。這些影像似乎是在彼此之上添加,而不是顯示一個,然后洗掉那個,然后加載另一個。
顯示影像時,我想在影像上疊加文字。
這是我用來創建影像和文本的代碼
Dim fname As String = (Actually an array in images(jpg) that display with timer)
Dim bm As New Bitmap(fname)
PicBox.Image = bm
findex -= 1 (index of image array)
Dim g As Graphics = PicBox.CreateGraphics
g.DrawImage(bm, 300, 10)
g.DrawString("Kishman Tukus", New Font("Arial", 24, FontStyle.Bold), Brushes.Green, 400, 100)
g.ResetTransform() '
g.Dispose()
我需要使用計時器在圖片框中一次顯示一個影像,并且我還需要在影像上疊加文本。
有人可以幫助我阻止影像添加到圖片框而不是一次顯示一個嗎?或者甚至更好,根本不使用PictureBox,只顯示帶有文本疊加層的影像?無論如何,我需要停止記憶體流血。謝謝
uj5u.com熱心網友回復:
我認為如何加載影像很重要。每次顯示時,您真的按檔案名加載每個影像嗎?這是誤導,正如你提到的有一個陣列。區別在于您保留對這些影像的參考,并且正在修改每個影像。請記住,這是一個參考型別,因此原始專案會被修改。因此,您最終會反復將文本寫入自身。具有諷刺意味的是,如果您確實在每個滴答聲中都加載了影像,那么您實際上不會遇到這個問題:)
我按照你所擁有的(我認為)做了一些事情,我們使用 Object.Clone 在每個位圖的記憶體中制作一個副本,您可以在不修改原始影像的情況下進行修改。
Private images As New List(Of Bitmap)()
Dim findex As Integer = 0
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim bmCopy = DirectCast(images(findex).Clone(), Bitmap)
Using g As Graphics = Graphics.FromImage(bmCopy)
g.DrawString(Guid.NewGuid().ToString(), New Font("Arial", 24, FontStyle.Bold), Brushes.Green, 400, 100)
End Using
PicBox.Image = bmCopy
findex = (findex 1) Mod images.Count()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
images.Add(My.Resources.Image1)
images.Add(My.Resources.Image2)
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub
沒有記憶體泄漏。您可以檢查記憶體增加,但 GC 最終將其清除。
uj5u.com熱心網友回復:
我希望看到更多類似的東西:
Dim bm As New Bitmap(fname)
Using g As Graphics = Graphics.FromImage(bm)
g.DrawString("Kishman Tukus", New Font("Arial", 24, FontStyle.Bold), Brushes.Green, 400, 100)
End Using
PicBox.Image = bm
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/384928.html
