^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Date:20180813
转自:https://blog.csdn.net/u012611878/article/details/52215985,感谢~
一、 BMP格式
BMP(Bitmap file)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图像文件格式与显示设备有关,因此把这种BMP图像文件格式成为设备相关位图DDB(Device Dependent Bitmap)文件格式。Windows 3.0以后的BMP图像文件格式与显示设备无关,目的是为了让Windows能够在任何类型的显示设备上显示所存储的图像。BMP位图文件默认的文件扩展名是BMP或者bmp(有时也会是DIB或RLE)。
注:Windows 3.0以后,在系统中仍然存在DDB位图,比如BitBit()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐以DIB格式保存。
- BMP格式结构
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
1. 位图文件头(bmp file header):提供文件的格式、大小等信息;
2. 位图信息头(bmp information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息;
3. 调色板(color palette):可选,如需使用索引表示图像,调色板就是索引与其对应颜色的映射表;
4. 位图数据(bmp data):图像数据区;
- BMP文件头
BMP文件头的结构体定义如下:
1 typedef struct tagBITMAPFILEHEADER 2 { 3 UINT16 bfType; // 2bytes,必须为“BM”,即0x424D才是Windows位图文件 4 DWORD bfSize; // 4bytes,整个BMP文件的大小 5 UINT16 bfReserved1; // 2bytes,保留,为0 6 UINT16 bfReserved2; // 2bytes,保留,为0 7 DWORD bfOffBits; // 4bytes,文件起始位置到图像像素数据的字节偏移量 8 } BITMAPFILEHEADER;
- BMP信息头
BMP信息头的结构体定义如下:
1 typedef struct _tagBMP_INFOHEADER 2 { 3 DWORD biSize; // 4bytes,INFOHEADER结构体的大小;存在其他版本的INFOHEADER,用作区分 4 LONG biWidth; // 4bytes,图像宽度(以像素为单位) 5 LONG biHeight; // 4bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2Bottom 6 WORD biPlanes; // 2bytes,图像数据平面数,BMP存储RGB数据,因此总为1 7 WORD biBitCount; // 2bytes,图像像素位数 8 DWORD biCompression; // 4bytes,0:不压缩,1:RLE8,2:RLE4,3:BITFIELDS 9 DWORD biSizeImage; // 4bytes,4字节对齐的图像数据大小 10 LONG biXPelsPerMeter; // 4bytes,用像素/米表示的水平分辨率 11 LONG biYPelsPerMeter; // 4bytes,用像素/米表示的垂直分辨率 12 DWORD biClrUsed; // 4bytes,实际使用的调色板索引数;0:使用所有的调色板索引 13 DWORD biClrImportant; // 4bytes,重要的调色板索引数;0:所有的调色板索引都重要 14 } BMP_INFOHEADER;
- BMP调色板
BMP调色板的结构体定义如下:
1 typedef struct _tagRGBQUAD 2 { 3 BYTE rgbBlue; // 指定蓝色强度 4 BYTE rgbGreen; // 指定绿色强度 5 BYTE rgbRed; // 指定红色强度 6 BYTE rgbReserved; // 保留,为0 7 } RGBQUAD;
1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据,即调色板最多只需要256项(索引 0-255)。
颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像为64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B、G、R、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号1的颜色,接下来的4字节表示颜色号2的颜色,依次类推。
颜色表中RGBQUAD结构体数据的个数由BMP_INFOHEADER::biBitCount决定。即当biBitCount = 1,4,8时,分别有2,16,256个颜色表项。具体是这样:
当biBitCount = 1时,为2色图像,BMP位图中有2个RGBQUAD数据结构;
当biBitCount = 4时,为16色图像,BMP位图中有16个RGBQUAD数据结构;
当biBitCount = 8时,为256色图像,BMP位图中有256个RGBQUAD数据结构;
- BMP图像数据区
位图数据记录了位图中的每一个像素的值,记录顺序——在扫描行内从左到右,扫描行之间从下到上(BMP_INFOHEADER::biHeight)。位图每个像素值所占的字节数由BMP_INFOHEADER::biBitCount决定。
Windows规定一个扫描行所占的字节数byte必须是4的倍数(即以long为单位),不足以0填充。一个扫描行所占字节数的计算方法:
DataSizePerLine = (BMP_INFOHEADER::biWidth * BMP_INFOHEADER::biBitCount + 31) / 8; // 一个扫描行所占的字节数
DataSizePerLine = DataSizePerLine / 4 * 4; // 字节数必须是4的倍数
DataSize = DataSizePerLine * BMP_INFOHEADER::biHeight;
颜色表接下来为位图的数据区,在此部分记录着每个像素点对应的调色板索引值——色号,其记录方式也随着颜色模式而定:即2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小 =(图像宽度图像高度记录像素的位数)/ 8。