基于图像宽高生成BMP文件头的C函数实现求助
BMP文件头与DIB头字段计算方案
以下基于24位真彩色、无压缩、无调色板的标准BMP格式(最常见场景),完成两个函数的未知字段填充:
1. 填充BMP_Header字段
void makeBMPHeader(struct BMP_Header* header, int width, int height){ // 计算每行图像数据的字节数(对齐到4字节) int row_bytes = ((width * 3 + 3) / 4) * 4; // 整个BMP文件的总大小:BMP头(14字节) + DIB头(40字节) + 图像数据大小 header->size = 14 + 40 + row_bytes * height; // 图像数据的偏移量:无调色板时,偏移量为BMP头+DIB头的总长度 header->offset = 14 + 40; }
字段说明:
size:文件总大小,由三部分组成:固定的BMP头(14字节)、固定的DIB头(40字节,对应BITMAPINFOHEADER)、计算得到的图像数据字节数。offset:图像数据在文件中的起始位置,无调色板时直接是两个头的总长度54字节。
2. 填充DIB_Header字段
void makeDIBHeader(struct DIB_Header* header, int width, int height) { // DIB头大小:标准BITMAPINFOHEADER的大小为40字节 header->size = 40; // 图像宽度,直接使用传入的width参数 header->width = width; // 图像高度,直接使用传入的height参数(正数值表示图像数据从下到上存储) header->height = height; // 位深度:24位真彩色,RGB各占8位 header->bit_count = 24; // 计算图像数据总大小:每行对齐后的字节数 × 高度 int row_bytes = ((width * 3 + 3) / 4) * 4; header->size_image = row_bytes * height; }
字段说明:
size:此处采用最常用的BITMAPINFOHEADER结构,固定为40字节。width/height:直接赋值为传入的图像宽高参数。bit_count:24代表24位真彩色,这是无需调色板的常见配置。size_image:图像数据的总字节数,需注意每行数据必须对齐到4字节(BMP格式要求),所以先计算每行对齐后的字节数,再乘以高度。
注意:如果是其他位深度(如8位带调色板)或压缩格式,字段计算逻辑会有变化,上述方案针对最通用的24位无压缩场景。
内容的提问来源于stack exchange,提问作者Jael
相关产品推荐
相关产品推荐

