Vb.net 屏幕截图,无Ram持续增加-使用后处理对象
我有一个VB.Net应用程序,它有一个带有按钮和图片框的表单。当我点击按钮时,它会截取笔记本电脑屏幕,添加一个光标,将其加载到PictureBox中,并将其保存为JPG文件 这正如预期的那样工作,但是每次单击按钮时RAM都会增加,并且不会释放按钮单击所使用的任何RAM。我相信这是因为位图对象在使用后没有被处理掉。然而,我不确定如何做到这一点。最后我尝试了Vb.net 屏幕截图,无Ram持续增加-使用后处理对象,vb.net,winforms,dispose,Vb.net,Winforms,Dispose,我有一个VB.Net应用程序,它有一个带有按钮和图片框的表单。当我点击按钮时,它会截取笔记本电脑屏幕,添加一个光标,将其加载到PictureBox中,并将其保存为JPG文件 这正如预期的那样工作,但是每次单击按钮时RAM都会增加,并且不会释放按钮单击所使用的任何RAM。我相信这是因为位图对象在使用后没有被处理掉。然而,我不确定如何做到这一点。最后我尝试了PictureBox1.Dispose()之类的方法 我还发现一些文章建议,我应该使用Using语句声明graphics对象,而不是Dim gr
PictureBox1.Dispose()
之类的方法
我还发现一些文章建议,我应该使用Using
语句声明graphics
对象,而不是Dim graph as graphics
,如:Using graph as graphics
然而,这对我也不起作用
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'THIS PART TAKES A SCREENSHOT
Dim area As Rectangle
Dim graph As Graphics
area = Screen.PrimaryScreen.Bounds
captured = New System.Drawing.Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
graph = Graphics.FromImage(captured)
graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy)
'HERE WE INSERT THE MOUSE CURSOR
Cursor.Draw(graph, New Rectangle(New Point(Cursor.Position.X - Cursor.HotSpot.X, Cursor.Position.Y - Cursor.HotSpot.Y), Cursor.Size))
'AND WE PUT THE PICTURE IN A PICTUREBOX
PictureBox1.Image = captured
PictureBox1.Image.Save("C:\temp\screenshot.jpg")
End Sub
如果您有任何想法,我将不胜感激,在最后一行代码的屏幕截图保存完成后,如何让它运行并释放所有RAM。试试这种方法
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'THIS PART TAKES A SCREENSHOT
Dim path As String
path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
path = IO.Path.Combine(path, "screenshot.jpg")
If PictureBox1.Image IsNot Nothing Then PictureBox1.Image.Dispose()
Dim area As Rectangle
Using captured As Drawing.Bitmap = New System.Drawing.Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
Using graph As Graphics = Graphics.FromImage(captured)
area = Screen.PrimaryScreen.Bounds
graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy)
Cursor.Draw(graph, New Rectangle(New Point(Cursor.Position.X - Cursor.HotSpot.X, Cursor.Position.Y - Cursor.HotSpot.Y), Cursor.Size))
captured.Save(path, Drawing.Imaging.ImageFormat.Jpeg)
PictureBox1.Image = Image.FromFile(path)
End Using
End Using
End Sub
PictureBox1.Image=captured
如果有上一个图像,则不会处理上一个图像,因此您应该检查,然后调用PictureBox1.Image.dispose()
我应该改为“使用图形作为图形”
是的,您应该,因为这样它会自动为您处理图形
对象。我已经在Form 1_load中添加了要加载的图片,因此我能够添加PictureBox1.Image.dispose()来调用它的帮助。谢谢不幸的是,当将“dim graph as graphics”更改为“Using graph as graphics”时,我遇到了一些错误,例如“Using”资源变量必须有一个显式初始化,“Using”必须以匹配的“end Using”结束。关于我的代码如何工作,有什么想法吗?再次感谢!添加captured?.Dispose()
在captured=New System.Drawing.Bitmap(…)
之前(这是您的图像,而不是PictureBox.Image),然后使用graph=Graphics更改。FromImage(captured)[…]结束使用并使用块将其余代码移到中。然后captured.Save(“C:\temp\screenshot.jpg”)
我添加了caputre.dispose()以及结尾处的“使用图形=图形.FromImage(捕获)”+“结束使用”。我现在得到以下错误:'ReadOnly'变量不能作为赋值的目标。它指向“Graph=图形.FromImage(捕获)”行。不是捕获.dispose()
,而是捕获?.dispose()
:您需要假设位图对象可能为空。--您应该将Private捕获为Bitmap=Nothing
。