通用GDI +错误

时间:2011-04-29 00:37:44

标签: .net wpf vb.net gdi+

我使用以下代码获得通用GDI错误。通常它符合并执行得很好但有时会因Generic GDI + Error而失败。有没有办法解决这个问题,或者在不使用inter-op的情况下截取屏幕截图?

Public Function CopyImageFromScreen(region as Int32Rect) As BitmapSource

    Dim img As New System.Drawing.Bitmap(region.Width, region.Height)
    Dim gfx As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(img)
    gfx.CopyFromScreen(region.X, region.Y, 0, 0, New System.Drawing.Size(region.Width, region.Height))
    img.LockBits(New System.Drawing.Rectangle(0, 0, img.Width, img.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, img.PixelFormat)

    Dim hObject As IntPtr = img.GetHbitmap 'This Line Causes the Error

    Dim WpfImage As BitmapSource = Interop.Imaging.CreateBitmapSourceFromHBitmap(hObject, IntPtr.Zero, _
        System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())

    Return WpfImage

End Function

1 个答案:

答案 0 :(得分:5)

这可能会有所帮助,也可能没有帮助,但我可以告诉你,它并没有清理此方法中分配的任何资源。即使这没有帮助,最好的做法是正确清理一次性物品并且不依赖GC。

也就是说,.NET框架中的“经典”图像支持(即System.Drawing.Image)主要是本机GDI / GDI +库的包装,并且容易泄露非托管资源。

我建议将imggfx对象包装在using块中,并通过对{{3的互操作来显式删除hObject句柄如果CreateBitmapSourceFromHBitmap失败,则包含在try / finally块中。

...为什么框架在Image类上提供GetHbitmap方法,但没有一种方法可以在没有interop代码的情况下删除它是一个谜。有关详细信息,请查看GetHbitmap上的MSDN文档。