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

时间:2009-03-19 16:09:58

标签: c winapi gdi

如果我使用CreateDIBSection()创建DIB,我可以通过将biHeight结构的BITMAPINFOHEADER字段设置为否定值来指定它应该是自上而下还是自下而上正面价值。但是,如果我在此类位图上调用GetObject()来填充DIBSECTION结构,则dsBm.bmHeightdsBmih.biHeight似乎始终为正。

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

3 个答案:

答案 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。

请参阅:GetDIBits Function

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