如果我使用 创建 DIB ,我可以通过将结构的字段设置为负值或正值CreateDIBSection()
来指定它应该是自上而下还是自下而上。但是,如果我调用这样的位图来填充结构,那么和似乎总是积极的。biHeight
BITMAPINFOHEADER
GetObject()
DIBSECTION
dsBm.bmHeight
dsBmih.biHeight
有没有办法找出 DIB 是自上而下还是自下而上,而我HBITMAP
只有
不; 为此,您需要 BITMAPINFOHEADER,并且它无法从 HBITMAP 中恢复。
无法从 GDI 检索该信息。正如您发现的那样,通过 GetObject 检索到的 BITMAP 和 BITMAPINFOHEADER bmHeight 字段始终为正。bmWidthBytes 字段同样为正值。如果您使用 GDI 句柄在 DIBSection 上(或从)绘制,GDI 将以正确的方式向上绘制 DIBSection。使用提取的 BITMAPINFOHEADER 会导致自上而下的位图错误。
从用户模式判断的唯一方法似乎是使用 GDI 进行测试 - SetPixel 将位图的左上角和左下角像素设置为两个不同的值,然后读取缓冲区以查看哪个写入落在第一个内存位置。
真正最好的选择是构建到您的 API 中 - 无论您将 DIBSection 作为 HBITMAP 传递,确保至少有一个 bool fIsDibSectionTopDown 传递或存储。
我认为你能从 HBITMAP 中得到的最好的东西就是 GetDIBits。然而,GetDIBits 的问题在于它还需要一个 HDC,而 HBITMAP 必须是一个 DDB。
参见:GetDIBits 函数
我不是很肯定,但是您可能会在转换中失去任何自上而下的感觉。