【发布时间】:2016-04-21 03:04:32
【问题描述】:
问题
我目前正在尝试创建一个应用程序,该应用程序将在用户在计算机上复制问题时创建用户屏幕的 gif/视频(尚未确定)。这显然意味着我需要通过计时器定期创建屏幕截图。
问题是 25 秒后(总是 25 秒),我收到一条错误消息,提示系统内存不足。
Exception thrown: 'System.OutOfMemoryException' in System.Drawing.dll
Additional information: Out of memory.
我的代码
下面是 Timer Tick 事件中的代码:
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())
感谢任何帮助。
【问题讨论】:
-
25 秒,每秒多少帧?图片尺寸是多少?做数学,你可能会明白为什么你的内存不足。您最好将文件保存在某个地方并用它们构建 GIF,只是不要将它们保存在内存中。顺便说一句,你为什么需要 HBITMAP?
-
这是我第一次尝试这样的事情,所以我有来自网络各地的点点滴滴,因此是 HBITMAP。我确实知道存储图像是一项艰巨的任务,因此我目前正在尝试的任何替代方法都非常受欢迎。计时器每秒运行两次,图像大小是我的屏幕分辨率,目前是 1680x1050
标签: .net vb.net timer bitmap screenshot