5

我正在处理类似这样的代码(从这里

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吗?

4

1 回答 1

5

我认为DeleteObject除了使用 p/invoke 之外,没有任何方法可以从 C# 调用。

因此,如果您想避免这种不受欢迎的非托管代码之旅,那么您应该GetHbitmap首先避免调用。你可以很容易地做到这一点。你想做一个BitmapSource. 通过调用来做到这一点BitmapSource.Create

于 2015-01-30T15:04:26.357 回答