VB.NET 在 RAM 中处理位图不起作用
VB.NET Dispose Bitmap in RAM wont work
首先,我对 Visual Basic.NET 比较陌生,我在这里遇到了一个问题。
我开始编写一个 screen2gif 记录器。它的主要目的是有效的。但是,如果我记录的时间超过 15 到 20 秒,我的 ram 就会过载并超过 x32 位应用程序的 3.5 Gb 限制。问题是我创建的位图一遍又一遍地堆叠。
Private Function getBitmap(ByVal pCtrl As Control) As Bitmap
Dim myBmp As Bitmap
If myBmp IsNot Nothing Then
myBmp.Dispose()
End If
myBmp = New Bitmap(pCtrl.Width, pCtrl.Height)
Dim g As Graphics = Graphics.FromImage(myBmp)
Dim p As New Point(pCtrl.Parent.Width - pCtrl.Parent.ClientRectangle.Width - 4, pCtrl.Parent.Height - pCtrl.Parent.ClientRectangle.Height - 4)
g.CopyFromScreen(pCtrl.Parent.Location + pCtrl.Location + p, Point.Empty, myBmp.Size)
Dim LocalMousePosition As Point
LocalMousePosition = panelTranspacrency.PointToClient(Cursor.Position)
Cursor.Draw(g, New Rectangle(New Point(LocalMousePosition.X, LocalMousePosition.Y), Cursor.Size))
Return myBmp
myBmp.Dispose()
g.Dispose()
End Function
Private Sub tmrWork_Tick(sender As Object, e As EventArgs) Handles tmrWork.Tick
counter += 1
Dim bm As Bitmap
bm = getBitmap(Me.panelTranspacrency)
bm.Save(My.Settings.outputpath & "\temp\" & counter & ".png", Drawing.Imaging.ImageFormat.Png)
bm.Dispose()
End Sub
这是我创建位图并将它们保存到磁盘的代码。
我提到我使用了 .Dispose 命令,但 ram 不会释放。
请看一下,给个提示。提前致谢。
改变
Dim g As Graphics = Graphics.FromImage(myBmp)
到
Using g As Graphics = Graphics.FromImage(myBmp)
并在 Return myBmp
之后放置 End Using
。你应该对
做同样的事情
Using bm As Bitmap = getBitmap(Me.panelTranspacrency)
并删除所有明确的 .Dispose 调用。
文档
https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/using-statement
首先,我对 Visual Basic.NET 比较陌生,我在这里遇到了一个问题。 我开始编写一个 screen2gif 记录器。它的主要目的是有效的。但是,如果我记录的时间超过 15 到 20 秒,我的 ram 就会过载并超过 x32 位应用程序的 3.5 Gb 限制。问题是我创建的位图一遍又一遍地堆叠。
Private Function getBitmap(ByVal pCtrl As Control) As Bitmap
Dim myBmp As Bitmap
If myBmp IsNot Nothing Then
myBmp.Dispose()
End If
myBmp = New Bitmap(pCtrl.Width, pCtrl.Height)
Dim g As Graphics = Graphics.FromImage(myBmp)
Dim p As New Point(pCtrl.Parent.Width - pCtrl.Parent.ClientRectangle.Width - 4, pCtrl.Parent.Height - pCtrl.Parent.ClientRectangle.Height - 4)
g.CopyFromScreen(pCtrl.Parent.Location + pCtrl.Location + p, Point.Empty, myBmp.Size)
Dim LocalMousePosition As Point
LocalMousePosition = panelTranspacrency.PointToClient(Cursor.Position)
Cursor.Draw(g, New Rectangle(New Point(LocalMousePosition.X, LocalMousePosition.Y), Cursor.Size))
Return myBmp
myBmp.Dispose()
g.Dispose()
End Function
Private Sub tmrWork_Tick(sender As Object, e As EventArgs) Handles tmrWork.Tick
counter += 1
Dim bm As Bitmap
bm = getBitmap(Me.panelTranspacrency)
bm.Save(My.Settings.outputpath & "\temp\" & counter & ".png", Drawing.Imaging.ImageFormat.Png)
bm.Dispose()
End Sub
这是我创建位图并将它们保存到磁盘的代码。 我提到我使用了 .Dispose 命令,但 ram 不会释放。
请看一下,给个提示。提前致谢。
改变
Dim g As Graphics = Graphics.FromImage(myBmp)
到
Using g As Graphics = Graphics.FromImage(myBmp)
并在 Return myBmp
之后放置 End Using
。你应该对
Using bm As Bitmap = getBitmap(Me.panelTranspacrency)
并删除所有明确的 .Dispose 调用。
文档 https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/using-statement