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

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

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

3个回答

1

无法从GDI中检索该信息。正如您发现的那样,通过GetObject检索到的BITMAP和BITMAPINFOHEADER bmHeight字段始终为正数。bmWidthBytes字段也是如此。

如果您使用GDI句柄在DIBSection上(或从DIBSection上)绘制,则GDI将以正确的方式绘制DIBSection。使用提取的BITMAPINFOHEADER将会使倒置的位图出错。

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

实际上,最好的选择是在API中构建 - 无论何时传递DIBSection作为HBITMAP,都要确保至少传递或存储了一个bool fIsDibSectionTopDown。


1
不行,你需要BITMAPINFOHEADER才能做到这一点,而且它无法从HBITMAP中恢复。

0

我认为你从HBITMAP获取的最好结果就是使用GetDIBits函数。但使用GetDIBits函数的问题在于,它也需要HDC,并且HBITMAP必须是DDB。

参见: GetDIBits Function

我不确定,但在转换过程中可能会失去任何自上而下的特性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接