【发布时间】:2015-06-21 16:54:33
【问题描述】:
我这样做是基于:
https://en.wikipedia.org/wiki/BMP_file_format
我想用 C 语言从头开始创建 BMP 图像。
#include <stdio.h>
#include <stdlib.h>
typedef struct HEADER {
short FileType;
int FileSize;
short R1;
short R2;
int dOffset;
} tp_header;
int main () {
FILE *image;
image = fopen("test.bmp", "w");
tp_header bHeader;
bHeader.FileType = 0x4D42;
bHeader.FileSize = 70;
bHeader.R1 = 0;
bHeader.R2 = 0;
bHeader.dOffset = 54;
fwrite(&bHeader, sizeof(struct HEADER), 1, image);
return 0;
}
我应该得到输出文件:
42 4D 46 00 00 00 00 00 00 00 36 00 00 00
但是我得到了:
42 4D 40 00 46 00 00 00 00 00 00 00 36 00 00 00
首先它应该只包含 14 个字节。那个“40 00”毁了这一切。这是在C中设置标题的正确方法吗?我还能如何限制输出的字节大小?
【问题讨论】:
-
编译器通常在结构字段之间放置填充。您不能将整个结构写入文件并期望它直接写入字段。如果你打印 sizeof(struct HEADER) 你会发现它比每个字段的总和长。您还应该使用宽度固定的类型,例如 uint32_t 和 uint16_t 而不是 int 和 short。
-
我现在使用的是固定宽度的类型。如果我不能只编写文件的整个结构并期望它完全按照我告诉计算机的内容编写,那么在编写文件时编程有什么用?说真的,BMP 图像有一个固定的结构,我研究并了解了它是如何工作的,但是我的编译器将不需要的数据推送到我的文件中,不再使其适合 BMP 结构和协议。为填充添加了 4 个字节破坏的文件...
-
不是重复的,因为写作不像阅读。
-
@RFiischer 回想一下,在定义 BMP 文件时,许多 PC 使用 16 位
ints 的软件。想想当你使用 32 位字段创建一个成功的结构时,一些未来的程序员会被 64 位对齐所困扰。