首页 > 解决方案 > 没有 Ram 不断增加的屏幕截图 - 使用后处理对象

问题描述

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

这可以按预期工作,但是每次单击按钮时 RAM 都会增加,并且不会释放单击按钮使用的任何 RAM。我相信这是由于位图对象在使用后没有被处理掉。但是我不确定如何做到这一点。我已经尝试过诸如PictureBox1.Dispose()最后的事情。

我还发现一些文章建议Dim graph as graphics我应该Graphics使用声明来声明对象,而不是Using,如: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 的想法都将不胜感激。

标签: vb.netwinformsdispose

解决方案


试试这个方法

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

推荐阅读