位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

       BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

  1. 位图文件头(bitmap-file header):提供文件的格式、大小等信息,一共14字节。
  2. 位图信息头(bitmap-information header):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,一共40字节。
  3. 调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表。
  4. 位图数据(bitmap data)。

        一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示。除了24位图,还有1位(单色),2位(4色,CGA),4位(16色,VGA),8位(256色),16位(增强色),24位(真彩色)和32位等。

实例分析

       使用WinHex打开这个文件,然后对源码进行分析。小端方式存储。

imagemagick 位深度_imagemagick 位深度

 位图文件头

       Windows为bmp文件头定义了如下结构体:

   

typedef struct tagBITMAPFILEHEADER 
        {  
               UINT16 bfType;                  // 2Bytes,必须为"BM",即0x4D42才是Windows位图文件
               DWORD bfSize;                 // 4Bytes,整个BMP文件的大小
               UINT16 bfReserved1;        // 2Bytes,保留,为0
               UINT16 bfReserved2;        // 2Bytes,保留,为0
               DWORD bfOffBits;             // 4Bytes,文件起始位置到图像像素数据的字节偏移量
        } BITMAPFILEHEADER;

位图信息头

       bmp信息头结构体定义如下:

   

typedef struct tagBITMAPFILEHEADER 
        {  
               DWORD biSize;                   // 4Bytes,指定此结构体的长度,为40
               LONG biWidth;                    // 4Bytes,位图宽
               LONG biHeight;                   // 4Bytes,位图高
               WORD biPlanes;                 // 2Bytes,平面数,为1
               WORD biBitCount;              // 2Bytes,像素位数,1/2/4/8/16/24/32
               DWORD biCompression;    // 4Bytes,压缩方式,0:不压缩,1:RLE8,2:RLE4
               DWORD biSizeImage;        // 4Bytes,4字节对齐的图像数据大小
               LONG biXPelsPerMeter;    // 4 Bytes,X方向分辨率
               LONG biYPelsPerMeter;    // 4 Bytes,Y方向分辨率
               DWORD biClrUsed;           // 4 Bytes,实际调色板索引数,0:使用所有调色板索引
               DWORD biClrImportant;    // 4 Bytes,重要的调色板索引数,0:所有调色板索引都重要
        } BITMAPINFOHEADER;

调色板

       bmp调色板结构体定义如下:

   

typedef struct tagRGBQUAD 
        {  
               BYTE rgbBlue;
               BYTE rgbGreen;
               BYTE rgbRed;
               BYTE rgbReserved;
        } RGBQUAD;

       1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据。调色板大小为N*4(bytes),其中N表示颜色的数目。每4字节表示一种颜色,分别为B(蓝色)、G(绿色)、R(红色)、alpha。

位图数据

biBitCount计算每个像素所占的字节数。