我使用以下代码获得通用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
答案 0 :(得分:5)
这可能会有所帮助,也可能没有帮助,但我可以告诉你,它并没有清理此方法中分配的任何资源。即使这没有帮助,最好的做法是正确清理一次性物品并且不依赖GC。
也就是说,.NET框架中的“经典”图像支持(即System.Drawing.Image)主要是本机GDI / GDI +库的包装,并且容易泄露非托管资源。
我建议将img
和gfx
对象包装在using
块中,并通过对{{3的互操作来显式删除hObject
句柄如果CreateBitmapSourceFromHBitmap
失败,则包含在try / finally块中。
...为什么框架在Image类上提供GetHbitmap方法,但没有一种方法可以在没有interop代码的情况下删除它是一个谜。有关详细信息,请查看GetHbitmap上的MSDN文档。