4

如果我使用 创建 DIB ,我可以通过将结构的字段设置为负值或正值CreateDIBSection()来指定它应该是自上而下还是自下而上。但是,如果我调用这样的位图来填充结构,那么和似乎总是积极的。biHeightBITMAPINFOHEADERGetObject()DIBSECTIONdsBm.bmHeightdsBmih.biHeight

有没有办法找出 DIB 是自上而下还是自下而上,而我HBITMAP只有

4

3 回答 3

1

不; 为此,您需要 BITMAPINFOHEADER,并且它无法从 HBITMAP 中恢复。

于 2009-03-19T17:46:22.823 回答
1

无法从 GDI 检索该信息。正如您发现的那样,通过 GetObject 检索到的 BITMAP 和 BITMAPINFOHEADER bmHeight 字段始终为正。bmWidthBytes 字段同样为正值。如果您使用 GDI 句柄在 DIBSection 上(或从)绘制,GDI 将以正确的方式向上绘制 DIBSection。使用提取的 BITMAPINFOHEADER 会导致自上而下的位图错误。

从用户模式判断的唯一方法似乎是使用 GDI 进行测试 - SetPixel 将位图的左上角和左下角像素设置为两个不同的值,然后读取缓冲区以查看哪个写入落在第一个内存位置。

真正最好的选择是构建到您的 API 中 - 无论您将 DIBSection 作为 HBITMAP 传递,确保至少有一个 bool fIsDibSectionTopDown 传递或存储。

于 2009-05-21T14:30:37.403 回答
0

我认为你能从 HBITMAP 中得到的最好的东西就是 GetDIBits。然而,GetDIBits 的问题在于它还需要一个 HDC,而 HBITMAP 必须是一个 DDB。

参见:GetDIBits 函数

我不是很肯定,但是您可能会在转换中失去任何自上而下的感觉。

于 2009-03-20T01:44:30.443 回答