Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 屏幕截图,无Ram持续增加-使用后处理对象_Vb.net_Winforms_Dispose - Fatal编程技术网

Vb.net 屏幕截图,无Ram持续增加-使用后处理对象

Vb.net 屏幕截图,无Ram持续增加-使用后处理对象,vb.net,winforms,dispose,Vb.net,Winforms,Dispose,我有一个VB.Net应用程序,它有一个带有按钮和图片框的表单。当我点击按钮时,它会截取笔记本电脑屏幕,添加一个光标,将其加载到PictureBox中,并将其保存为JPG文件 这正如预期的那样工作,但是每次单击按钮时RAM都会增加,并且不会释放按钮单击所使用的任何RAM。我相信这是因为位图对象在使用后没有被处理掉。然而,我不确定如何做到这一点。最后我尝试了PictureBox1.Dispose()之类的方法 我还发现一些文章建议,我应该使用Using语句声明graphics对象,而不是Dim gr

我有一个VB.Net应用程序,它有一个带有按钮和图片框的表单。当我点击按钮时,它会截取笔记本电脑屏幕,添加一个光标,将其加载到PictureBox中,并将其保存为JPG文件

这正如预期的那样工作,但是每次单击按钮时RAM都会增加,并且不会释放按钮单击所使用的任何RAM。我相信这是因为位图对象在使用后没有被处理掉。然而,我不确定如何做到这一点。最后我尝试了
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