gpt4 book ai didi

.net - 使用 Image.FromHbitmap() 构造位图时,多久可以删除原始位图句柄?

转载 作者:行者123 更新时间:2023-12-04 21:26:05 24 4
gpt4 key购买 nike

来自 Image.FromHbitmap() 的文档在 http://msdn.microsoft.com/en-us/library/k061we7x%28VS.80%29.aspx :

The FromHbitmap method makes a copy of the GDI bitmap; so you can release the incoming GDI bitmap using the GDIDeleteObject method immediately after creating the new Image.


这非常明确地表明,一旦创建 Bitmap 实例,就可以使用 DeleteObject 立即删除位图句柄。
查看 Image.FromHbitmap() 的执行情况然而,使用 Reflector 表明它是 GDI+ 函数的一个非常薄的包装器, GdipCreateBitmapFromHBITMAP() .
关于 GDI+ 平面 API 函数的文档非常少,但是 http://msdn.microsoft.com/en-us/library/ms533971%28VS.85%29.aspxGdipCreateBitmapFromHBITMAP()对应于 Bitmap::Bitmap()采用 HBITMAP 的构造函数和 HPALETTE作为参数。
此版本的 Bitmap::Bitmap() 的文档 http://msdn.microsoft.com/en-us/library/ms536314%28VS.85%29.aspx 的构造函数有话要说:

You are responsible for deleting the GDI bitmap and the GDI palette. However, you should not delete the GDI bitmap or the GDI palette until after the GDI+ Bitmap::Bitmap object is deleted or goes out of scope.

Do not pass to the GDI+ Bitmap::Bitmap constructor a GDI bitmap or a GDI palette that is currently (or was previously) selected into a device context.


此外,可以在 GdiPlusBitmap.h 中 GDI+ 的 C++ 部分的源代码中看到 Bitmap::Bitmap()有问题的构造函数本身就是 GdipCreateBitmapFromHBITMAP() 的包装器。来自平面 API 的函数:
inline 
Bitmap::Bitmap(
IN HBITMAP hbm,
IN HPALETTE hpal
)
{
GpBitmap *bitmap = NULL;

lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);

SetNativeImage(bitmap);
}
我看不到的是 GdipCreateBitmapFromHBITMAP() 的实现那是这个功能的核心,但是文档中的两个评论似乎是矛盾的。 .Net 文档说我可以立即删除位图句柄,而 GDI+ 文档说必须保留位图句柄,直到删除包装对象,但两者都基于相同的 GDI+ 函数。
此外,GDI+ 文档警告不要使用当前或以前选择到设备上下文中的源 HBITMAP。虽然我可以理解为什么当前不应该将位图选择到设备上下文中,但我不明白为什么会有警告不要使用以前选择到设备上下文中的位图。这似乎会阻止使用已使用标准 GDI 在内存中创建的 GDI+ 位图。
所以,总结一下:
  • 原始位图句柄是否需要保留,直到 .Net Bitmap 对象被释放?
  • GDI+ 功能,GdipCreateBitmapFromHBITMAP() ,制作源位图的副本还是仅保留原始位图的句柄?
  • 为什么我不应该使用之前选择到设备上下文中的 HBITMAP?
  • 最佳答案

    根据经验,.Net 文档似乎是正确的。确实可以立即调用DeleteObject()在 HBITMAP 上传递给 Image.FromHbitmap()并且这样做似乎没有任何不良影响。

    根据我通过对代码进行逆向工程所学到的知识,这同样适用于 GDI+ Bitmap::Bitmap()构造函数和 GDI+ GdipCreateBitmapFromHBITMAP()功能也是如此,尽管这与已发布的文档相矛盾。

    也许 GDI+ 文档过于保守 - 保留在 future 版本中保留提供的 HBITMAP 句柄的权利。如果 GDI+ 中发生这种变化,.Net 框架将不得不进行更改以通过在将位图传递给 GDI+ 之前制作位图副本来保留其已发布的契约(Contract)。

    关于.net - 使用 Image.FromHbitmap() 构造位图时,多久可以删除原始位图句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3057002/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com