结构体信息可以看这里
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapfileheader
这里最容易出错的地方就是这里的
#pragma pack(push, 1) // 确保结构体对齐方式与 BMP 格式一致
#pragma pack(pop)
对这个的讲解我这里直接引用了AI的(讲的是真的好(〃` 3′〃))
#pragma pack(push, 1) 和 #pragma pack(pop) 的作用
这两个编译指令用来控制 结构体成员的对齐方式,特别是设置如何在内存中排列结构体的数据。
默认对齐方式
默认情况下,编译器会对结构体成员进行对齐,以优化内存访问的性能。
例如,如果一个结构体成员是 uint32_t 类型(4 字节),它通常会对齐到 4 字节边界。这样会导致结构体中可能出现一些额外的 填充字节(padding),以保证对齐。
例如:
1 | typedef struct { |
#pragma pack(push, 1)
当使用 #pragma pack(push, 1) 时,结构体的成员按 1 字节对齐。也就是说,成员会紧密排列,不会插入填充字节。
改用 #pragma pack(push, 1) 的情况:
1 |
|
为什么在处理 BMP 文件时使用?
BMP 文件头和信息头的格式是严格定义的,它们在文件中的每一部分都需要紧密排列,不能有填充字节。
例如:
BMPFileHeader的大小必须是 14 字节。BMPInfoHeader的大小必须是 40 字节。
如果使用默认对齐方式,结构体可能会包含填充字节,导致文件格式不符合规范。使用 #pragma pack(push, 1) 可以确保数据结构的内存布局与 BMP 文件的定义完全一致。
#pragma pack(pop)
这个指令用来恢复对齐方式到之前的状态。
#pragma pack(push, 1) 改变了对齐方式,因此在定义完需要紧密对齐的结构体后,用 #pragma pack(pop) 恢复默认对齐方式,以免影响后续代码的性能。
总结
#pragma pack(push, 1)确保结构体紧密对齐,无填充字节,适合文件格式的定义。#pragma pack(pop)恢复默认对齐方式,避免全局影响。- 在处理像 BMP 这种对数据格式严格要求的场景时,显得尤为重要。
将视频转BMP图片的案例
1 |
|
说些什么吧!