VB.NET Bitmap.Save工作一次

时间:2014-03-15 16:45:51

标签: vb.net screenshot

我有一个获取屏幕截图,保存并将文件名返回给图像的函数。我使用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

1 个答案:

答案 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