You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于图像宽高生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:35:12