基于C语言创建在BMP图片中高频率使用的三大核心结构体
大家好,我是小智!
在动手读写BMP文件时,核心之一就在于对其三大结构体的定义与解析。本文只记录以下三个结构体定义:
- BITMAPFILEHEADER — 文件头(14 字节)
- BITMAPINFOHEADER — 信息头(40 字节)
- 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

浙公网安备 33010602011771号