【问题标题】:How do I determine if a DIB is bottom-up or top-down?如何确定 DIB 是自下而上还是自上而下?
【发布时间】:2010-10-14 08:29:18
【问题描述】:

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

当我只有HBITMAP 时,有没有办法确定 DIB 是自上而下还是自下而上?

【问题讨论】:

    标签: c winapi gdi


    【解决方案1】:

    没有;为此,您需要 BITMAPINFOHEADER,它无法从 HBITMAP 中恢复。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        请参阅:GetDIBits Function

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-13
          • 2021-05-08
          • 1970-01-01
          • 2021-10-16
          • 2021-10-30
          • 2020-03-08
          相关资源
          最近更新 更多