本文共 2039 字,大约阅读时间需要 6 分钟。
BMP,全称BitMap,是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB)。BMP是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。
BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储方式小端格式,即低地址村存放低位数据,高地址存放高位数据。图像的扫描方式是按从左到右、从下到上的顺序。
BMP文件可以分为四个部分:
① BMP文件头(bitmap-file header) :一共14个字节,包含BMP图像文件的类型、文件大小等信息;
② BMP信息头(bitmap information):一共40个字节,它包含有 BMP 图像的宽、高、压缩方法,以及定义颜色等信息;
③ BMP调色板(color palette) :可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表;
④ BMP数据(bitmap data) :位图数据根据BMP位图使用的位数决定,在 24 位图中使用 RGB ,小于 24 位的使用 调色板中颜色索引值。
1. BMP文件头
typedef struct tagBITMAPFILEHEADER
{ UINT16 bfType; //表示文件类型,可取值为:BM — Windows BA — OS/2 Bitmap ArrayCI — OS/2 Color Icon CP — OS/2 Color Pointer
IC — OS/2 Icon PT — OS/2 Pointer
UINT32 bfSize; //用字节表示整个文件的大小,以字节为单位; UINT16 bfReserved1; //保留位,必须设置为0 UINT16 bfReserved2; //保留位,必须设置为0 UINT32 bfOffBits; //从文件开始到位图数据开始之间的偏移量,偏移量大小=文件头大小+信息头大小+调色板大小。 } BITMAPFILEHEADER;2. BMP信息头
typedef struct tagBITMAPINFOHEADER{
UINT32 biSize; //位图信息头长度,为40 UINT32 biWidth; //位图的宽度(单位为像素) UINT32 biHeight; //位图的高度(单位为像素) UINT16 biPlanes; //平面数,恒为1 UINT16 biBitCount; //每个像素的位数,可以是1,2,4,8,16,24,新的可以是32 UINT32 biCompression; //压缩方式,0 - 不压缩 (使用BI_RGB表示)1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
UINT32 biSizeImage; //位图 数据 的大小,以字节为单位 UINT32 biXPelsPerMeter; //位图水平分辨率,每米像素数 UINT32 biYPelsPerMeter; //位图水平分辨率,每米像素数 UINT32 biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) UINT32 biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 } BITMAPINFOHEADER;3. BMP调色板
调色板其实是一张映射表,映射表中的个数由biBitCount来确定,当 biBitCount=1,4,8 时,分别有 2,16,256个颜色 ; 当 biBitCount=24 时,没有颜色表项。
标识颜色索引号与其代表的颜色的对应关系,它在文件中的布局就像一个二维数组palette[N][4],其中N表示总的颜色索引数,每行的四个元素分别表示该索引对应的B、G、R和Alpha的值,每个分量占一个字节。如不设透明通道时,Alpha为0。
4. BMP数据
BMP数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右 , 扫描行之间是从下到上。位图的一个像素值所占的字节数 :
当 biBitCount=1时,8 个像素占1个字节 ;
当 biBitCount=4时,2 个像素占1个字节 ;
当 biBitCount=8时,1 个像素占1个字节 ;
当 biBitCount=24时, 1 个像素占3个字节 ;
Windows 规定一个扫描行所占的字节数必须是 4 的倍数 ( 即以 long 为单位 ), 不足的以 0 填充,也是说,写入图片一行的像素信息的时候,每一行的字节数都必须是4的倍数,不足的在后面补0,然后才又开始写入下一行的像素信息。
转载地址:http://mzadi.baihongyu.com/