我正在处理这样的代码(从这里开始)
using (var bmp = new System.Drawing.Bitmap(1000, 1000))
{
IntPtr hBitmap = bmp.GetHbitmap();
var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hBitmap, IntPtr.Zero, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
MSDN 说,每当我调用Bitmap.GetHbitmap()
时,我都必须在hBitmap
上呼叫DeleteObject()
以释放非托管资源。
看到的所有答案和MSDN都说我必须P/调用DeleteObject()
函数。这看起来有点疯狂,因为我在没有 P/Invoke 的情况下获得了hBitmap
,现在我突然需要使用 P/Invoke 来正确摆脱它。
除了 P/Invoke 之外,真的没有其他方法可以要求DeleteObject()
hBitmap
吗?
我认为除了使用 p/invoke 之外,没有任何方法可以从 C# 调用DeleteObject
。
因此,如果要避免这种意外的非托管代码之旅,则应首先避免调用GetHbitmap
。你可以很容易地做到这一点。你想做一个BitmapSource
.通过打电话给BitmapSource.Create
来做到这一点。