基于C语言创建在BMP图片中高频率使用的三大核心结构体

      大家好,我是小智!

      在动手读写BMP文件时,核心之一就在于对其三大结构体的定义与解析。本文只记录以下三个结构体定义:

  1. BITMAPFILEHEADER — 文件头(14 字节)
  2. BITMAPINFOHEADER — 信息头(40 字节)
  3. RGBQUAD — 调色板条目(4 字节/项,1 位至 8 位位图才有)

注意:在写代码前,需要仔细考虑字节对齐的情况!!!

BMP 文件头

typedef struct {
    unsigned short bfType;      // 必须是 'BM' (0x4D42)
    unsigned int   bfSize;      // 文件总大小(字节)
    unsigned short bfReserved1; // 保留,必须为 0
    unsigned short bfReserved2; // 保留,必须为 0
    unsigned int   bfOffBits;   // 像素数据区起始偏移(字节)
} BITMAPFILEHEADER_t;
  • bfType:文件签名,固定 "BM"

  • bfSize:从头到尾的总字节数

  • bfOffBits:一般为 54(14 + 40),若含调色板则更大

BMP 信息头

typedef struct {
    unsigned int   biSize;          // 本结构体大小:40
    int            biWidth;         // 图像宽度(像素)
    int            biHeight;        // 图像高度(像素)
    unsigned short biPlanes;        // 颜色平面数,始终为 1
    unsigned short biBitCount;      // 色深(1,4,8,16,24,32)
    unsigned int   biCompression;   // 压缩类型(0=BI_RGB 无压缩)
    unsigned int   biSizeImage;     // 像素数据大小(字节)
    int            biXPelsPerMeter; // 水平分辨率(像素/米)
    int            biYPelsPerMeter; // 垂直分辨率(像素/米)
    unsigned int   biClrUsed;       // 调色板实际使用数(0=默认)
    unsigned int   biClrImportant;  // 重要颜色数(0=全部)
} BITMAPINFOHEADER_t;
  • biBitCount 决定像素存储方式:

    • 24 位:每像素 3 字节(B, G, R)

    • 8 位及以下:需用调色板

  • biCompression:常用 0(BI_RGB),不压缩

调色板条目

      仅在色深 ≤ 8 时存在,用来描述每个索引颜色:

typedef struct {
    unsigned char rgbBlue;     // 蓝分量
    unsigned char rgbGreen;    // 绿分量
    unsigned char rgbRed;      // 红分量
    unsigned char rgbReserved; // 保留,通常置 0
} RGBQUAD_t;
  • 每项 4 字节

  • 总条目数 = info.biClrUsed 或 1 << biBitCount

posted @ 2025-05-30 02:04  努力赚钱的小智  阅读(79)  评论(0)    收藏  举报