BMP 文件格式的详解

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 Array

                                                                                              CI   — 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,然后才又开始写入下一行的像素信息。

 

猜你喜欢

转载自blog.csdn.net/sean_8180/article/details/81435614