【问题标题】:Processing bitmap header处理位图头
【发布时间】:2013-02-04 09:25:25
【问题描述】:

我有两个关于BITMAPFILEHEADER 结构的问题。

首先,如果我们制作我们自己版本的该结构,分配的内存将是 16 字节,因为 Data Structure Alignment。但是BITMAPFILEHEADER 的那个是14 字节。为什么会这样?

第二,正如您已经知道的,Bitmap Header 是 Little-Endianed。因此,当您希望正确访问该值时,您需要将其转换为 Big-Endian。但是,如果您看到 this question,您会看到接受的答案没有任何作用。你们能解释一下怎么可能吗?

提前感谢您的帮助。

【问题讨论】:

    标签: c image bitmap directx


    【解决方案1】:

    文件可以有任何类型的对齐方式,位图文件的标题恰好是 14 字节(更多信息:http://en.wikipedia.org/wiki/BMP_file_format)。没有规则说所有内容都必须对齐(例外是 SSE 指令,它希望所有内容都对齐)。对齐的数据可以更快地访问,因此建议您对齐数据,但您不必这样做。文件格式也没有对齐数据。

    如果你想读取值,你需要将它转换为大端,但如果你只是想创建一个新的位图,你必须以与 BITMAPFILEHEADER 结构中预期相同的格式存储数据,即小端。

    【讨论】:

    • 你的意思是当你只创建一个位图时,字节序无关紧要..?真的吗?
    • 对不起,如果我有点不清楚。字节序始终很重要,但我的意思是,无论您运行的平台的字节序如何,您都需要以与文件规范中指定的相同字节序将数据写入文件。对人类来说,读取大端格式的值是有意义的,但如果将大端格式写入 BMP 文件,则该文件将不正确。
    • 我不是在谈论将数据写入文件。我当然同意 BMP 文件应该是 little-endian。但是在将 bmp 加载到字节数组之后,为了让 Windows 正确读取该结构的值,我猜应该考虑字节数组的字节顺序。
    • 是的,确实如此,当您实际使用例如像素数据时,您需要考虑字节顺序。但是您问在您提供的链接中,答案与字节序无关。那是因为他调用了 CreateDIBitmap,它只生成了一个标题。您不必担心传递给该方法的值的字节顺序。这就是您的问题的解释方式:)
    • 我认为 CreateDIBitmap 关心字节序。正如您在 CreateDIBitmap 接收的参数中看到的那样,很明显该函数将尝试访问结构 BITMAPINFOHEADER 的值,而无需考虑字节序。
    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2012-11-30
    • 2018-09-22
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多