我有一个获取屏幕截图,保存并将文件名返回给图像的函数。我使用Bitmap.Save方法,我想我自己清理干净了。然而,它只能工作一次 - 如果用户再次调用例程,我会得到一个非常有用的外部异常" GDI +"中出现了一般错误。消息。
它可以保存到目录一次(权限似乎不是问题)。并且,如果我更改文件名(例如,使用简单的计数器),它一直有效 - 在我看来,只是在临时目录中留下了一个烂摊子。
我已经阅读了一些MSDN文章,这些文章让我相信我认为我已经锁定了文件,但不知道我做错了什么。
以下是代码:
Function GetImage()
Dim tempFile As String = Path.GetTempPath() & "Screen_Log.jpg"
Me.WindowState = FormWindowState.Normal
Me.Activate()
Me.Refresh()
Dim bmpScreenshot As Bitmap = New Bitmap(Width, Height, PixelFormat.Format32bppArgb)
Dim gfxScreenshot As Graphics = Graphics.FromImage(bmpScreenshot)
gfxScreenshot.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, Me.Size, CopyPixelOperation.SourceCopy)
' *** Works once, then crashes here.
bmpScreenshot.Save(tempFile, ImageFormat.Jpeg)
bmpScreenshot.Dispose()
gfxScreenshot.Dispose()
Return tempFile
End Function
有什么建议吗?
-Gnerf
答案 0 :(得分:1)
Bitmaps
非常粘。试试这个,看看它是否解决了这个问题。尝试不使用GC部分,看看using块是否足够 - 否则添加垃圾收集调用。
Function GetImage() As String
Dim tempFile As String = Path.GetTempPath() & "Screen_Log.jpg"
Using bmpScreenshot As Bitmap = New Bitmap(Width, Height, PixelFormat.Format32bppArgb)
Using gfxScreenshot As Graphics = Graphics.FromImage(bmpScreenshot)
gfxScreenshot.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, Me.Size, CopyPixelOperation.SourceCopy)
bmpScreenshot.Save(tempFile, ImageFormat.Jpeg)
End Using
End Using
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
Return tempFile
End Function