1. BMP文件的组成
BMP文件的结构分成3 块或4块,分别是 文件头,文图信息头, 颜色表, 位图数据。
对于真彩色图片,没有颜色表这块,所以它的结构分成3块。
该结构列表如下:
BMP文件格式
模块 组 成 内 容
文件头 包含文件的大小、文件类型、图像数据偏离文件头的长度
位图信息头 信息头尺寸、图像用几个比特数值表示一个像素、图像是否压缩、图像所用的颜色数
颜色信息 包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。
图形数据 表示图像的相应的像素值
各模块的数据结构如下:
数据结构:
文件头 typedef struct ITMAPFILEHEADER{WORD bfType; // 位图文件的类型,必须为“BM”DWORD bfSize; // 位图文件的大小,以字节为单位WORD bfReserved1; //保留字,必须为0WORD bfReserved2; //保留字,必须为0DWORD bfOffBits; // 位图数据的偏移量,以字节为单位} BITMAPFILEHEADER; 该结构占据14个字节。
位图信息头 typedef struct ITMAPINFOHEADER{DWORD biSize; // 本结构所占用字节数LONG biWidth; // 位图的宽度,以像素为单位LONG biHeight; // 位图的高度,以像素为单位WORD biPlanes; // 须为1WORD biBitCount // 每个像素所需的位数,是 1(双色), 4(16色),8(256色)或 24(真彩色)DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或 2(BI_RLE4压缩类型)DWORD biSizeImage; // 位图数据区域的大小, 以字节为单位LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数DWORD biClrImportant; // 位图显示过程中重要的颜色数} BITMAPINFOHEADER; 该结构占据40个字节。
颜色信息 typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)BYTE rgbGreen; // 绿色的亮度(值范围为0-255)BYTE rgbRed; // 红色的亮度(值范围为0-255)BYTE rgbReserved; // 保留,必须为0} RGBQUAD;
图形数据 表示图像的相应的像素值
2. BMP文件数据存储特点
对于整个文件 从左到右, 从下到上(最下一行 To 最上一行)
对于每行 从左到右
每行存储 字节数须为4(long型)的倍数,不足要以0补齐
3. BMP文件分析
windows 下该文件属性为: 96*9, 单色, 170Bytes
分析类容的结果是:
文件头:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; 0x4D42
DWORD bfSize; AA (170Bytes)
WORD bfReserved1; 0
WORD bfReserved2; 0
DWORD bfOffBits; 3E (62)
} BITMAPFILEHEADER;
位图信息头:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //表示本结构的大小 28 (40Bytes)
LONG biWidth; //位图的宽度 60 (96)
LONG biHeight; //位图的高度 09 (09)
WORD biPlanes; // 1
WORD biBitCount; //位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究 1
DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释 0
DWORD biSizeImage; //表示位图数据区域的大小以字节为单位 6c (108)
LONG biXPelsPerMeter; 0EC4
LONG biYPelsPerMeter; 0EC4
DWORD biClrUsed; 0
DWORD biClrImportant; 0
} BITMAPINFOHEADER;