我正在处理类似这样的代码(来自here)
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()
时,我都必须致电DeleteObject()
上的hBitmap
以释放非托管资源。
我见过的所有答案和MSDN说我必须P / Invoke DeleteObject()
函数。这看起来有点疯狂,因为我获得了hBitmap
没有P / Invoke,现在我突然需要使用P / Invoke来正确摆脱它。
除了P / Invoke之外,确实没有其他办法让DeleteObject()
调用我的hBitmap
吗?
答案 0 :(得分:4)
除了使用p / invoke之外,我认为没有办法从C#调用DeleteObject
。
因此,如果您想避免这种不受欢迎的非托管代码,那么您应该首先避免调用GetHbitmap
。你可以很容易地做到这一点。你想要BitmapSource
。通过拨打BitmapSource.Create
来执行此操作。