如果我使用CreateDIBSection()
创建DIB,我可以通过将biHeight
结构的BITMAPINFOHEADER
字段设置为否定值来指定它应该是自上而下还是自下而上正面价值。但是,如果我在此类位图上调用GetObject()
来填充DIBSECTION
结构,则dsBm.bmHeight
和dsBmih.biHeight
似乎始终为正。
当我拥有DIB是HBITMAP
时,有没有办法找出DIB是自上而下还是自下而上?
答案 0 :(得分:1)
没有;你需要BITMAPINFOHEADER,它不能从HBITMAP中恢复。
答案 1 :(得分:1)
无法从GDI检索该信息。正如你发现通过GetObject检索的BITMAP和BITMAPINFOHEADER bmHeight字段总是正面的。 bmWidthBytes字段同样是正面的。 如果您使用GDI手柄绘制(或来自)DIBSection,GDI将以正确的方式绘制DIBSection。使用提取的BITMAPINFOHEADER会使自上而下的位图错误。
从usermode告诉的唯一方法似乎是使用GDI来测试 - 将位图的左上角和左下角像素设置为两个不同的值,然后读取缓冲区以查看哪个写入位于第一个内存位置
真正最好的选择是构建你的API - 当你作为HBITMAP传递DIBSection时,确保至少传递或存储了bool fIsDibSectionTopDown。
答案 2 :(得分:0)
我认为你能从HBITMAP获得的最好成绩是GetDIBits。然而,GetDIBits的问题在于它还需要HDC并且HBITMAP必须是DDB。
我不是肯定的,但可能你会失去转换中的任何自上而下。