如何确定DIB是自下而上还是自上而下?

如果我使用CreateDIBSection()创建一个DIB,我可以通过将BITMAPINFOHEADER结构的biHeight字段设置为负值或正值来指定它应该是自顶向下还是自底向上。 但是,如果我在这样的位图上调用GetObject()来填充DIBSECTION结构,那么dsBm.bmHeightdsBmih.biHeight似乎总是正数。

当我拥有的是HBITMAP时,有没有办法找出DIB是自上而下还是自下而上?

我认为你能从HBITMAP获得的最好成绩是GetDIBits。 然而,GetDIBits的问题在于它还需要HDC并且HBITMAP必须是DDB。

请参阅: GetDIBits函数

我不是积极的,但你可能会失去转换中的任何自上而下。

没有; 你需要BITMAPINFOHEADER,它不能从HBITMAP中恢复。

无法从GDI检索该信息。 正如你发现通过GetObject检索的BITMAP和BITMAPINFOHEADER bmHeight字段总是正面的。 bmWidthBytes字段同样是正面的。 如果您使用GDI手柄绘制(或来自)DIBSection,GDI将以正确的方式绘制DIBSection。 使用提取的BITMAPINFOHEADER会使自上而下的位图错误。

从usermode告诉的唯一方法似乎是使用GDI来测试 – 将位图的左上角和左下角像素设置为两个不同的值,然后读取缓冲区以查看哪个写入落在第一个内存位置。

真正最好的选择是构建你的API – 当你作为HBITMAP传递DIBSection时,确保至少传递或存储了bool fIsDibSectionTopDown。