.net 捕获位图导致内存不足异常

.net 捕获位图导致内存不足异常,.net,vb.net,timer,bitmap,screenshot,.net,Vb.net,Timer,Bitmap,Screenshot,问题 我目前正在尝试创建一个应用程序,当用户在计算机上复制问题时,该应用程序将创建用户屏幕的gif/视频(尚未决定)。这显然意味着我需要通过计时器定期创建屏幕截图 问题是25秒后(总是25秒),我收到一个错误,说系统内存不足 Exception thrown: 'System.OutOfMemoryException' in System.Drawing.dll Additional information: Out of memory. 我的代码 以下是计时器滴答声事件中的代码: Priv

问题

我目前正在尝试创建一个应用程序,当用户在计算机上复制问题时,该应用程序将创建用户屏幕的gif/视频(尚未决定)。这显然意味着我需要通过计时器定期创建屏幕截图

问题是25秒后(总是25秒),我收到一个错误,说系统内存不足

Exception thrown: 'System.OutOfMemoryException' in System.Drawing.dll

Additional information: Out of memory.
我的代码

以下是计时器滴答声事件中的代码:

Private DebugVid As New List(Of IntPtr)

Private Sub tmrDebug_Tick(sender As Object, e As EventArgs) Handles tmrDebug.Tick

    Dim CurrentScreen As Screen = Screen.PrimaryScreen
    For Each SCR As Screen In Screen.AllScreens
        If SCR.Bounds.Contains(MousePosition) Then
            CurrentScreen = SCR
        End If
    Next

    Using ScreenGrab As New Bitmap(CurrentScreen.Bounds.Width, CurrentScreen.Bounds.Height)
        Using g As Graphics = Graphics.FromImage(ScreenGrab)
            g.CopyFromScreen(New Point(CurrentScreen.Bounds.X, CurrentScreen.Bounds.Y), New Point(0, 0), ScreenGrab.Size)
            g.DrawImage(My.Resources.MyCursor, New Point(MousePosition.X - CurrentScreen.Bounds.X, MousePosition.Y))
        End Using
        DebugVid.Add(ScreenGrab.GetHbitmap())
    End Using

    GC.Collect()
End Sub
第一部分只是定义了光标在哪个屏幕上,这样我就知道应该在哪个屏幕上创建位图

第二部分创建位图,对其应用屏幕截图,在鼠标位置绘制光标,最后将整数指针存储在列表中

用户单击按钮停止录制后,会将其转换为gif(此时)

引发异常的代码部分如下所示:

DebugVid.Add(ScreenGrab.GetHbitmap())

非常感谢您的帮助。

这可能需要在内存中保存大量非托管GDI句柄和位图数据。如果在25秒后,您释放了可用的句柄,甚至是可用的进程内存,我一点也不会感到惊讶。您可能需要考虑将每一帧保存到磁盘上。然后在录制完成后,将单个图像处理为gif格式


根据操作系统和配置的不同,进程可用的GDI句柄数量可以从256个到65536个不等。您拍摄的每个屏幕截图都至少使用了一个句柄,您的应用程序和.net framework正在使用更多的句柄。

25秒,每秒多少帧?图像大小是多少?做数学题,你可能会明白为什么你的内存不足。你最好把文件保存在某个地方,用它们生成GIF,只是不要把它们保存在内存中。顺便说一句,你为什么需要HBITMAP?这是我第一次尝试这样的东西,所以我有来自网络各地的信息,因此HBITMAP。我知道存储图像是一项艰巨的任务,所以我现在尝试的任何替代方案都是非常受欢迎的。计时器每秒运行两次,图像大小是我屏幕的分辨率,目前为1680x1050。我已经尝试了你的建议,将基本64字符串版本的屏幕截图保存在文本文件中,而不是存储在内存中。该文件在大约一分半钟内达到8GB,因此并不完全可行。有更好的存储方法吗?Base64编码实际上会使文件变大。我建议将每个帧保存为
png
。它应该给你显著的压缩而不损失质量。另外,在8GB的磁盘上,这当然可以解释为什么你的内存不足。大约100MB在1分钟内,我认为这是我将得到的最好的,所以非常感谢你。我只需要记住在创建GIF时删除PNG!