BMP位图结构

来源:互联网 发布:广发白发大数据001731 编辑:程序博客网 时间:2024/05/16 04:49

   BMP(Bitmap)文件是windows采用的图形文件格式。其可分为与设备相关的位图(device dependent bitmap 简称DDB)和与设备无关的位图(device independent bitmap 简称 DIB)两种;但现在基本上不用DDB了,因为它相当依赖于设备。在windows 3.0以前才使用,在windows3.0之后大多使用的都是DIB。位图文件一般以BMP为后缀名;少数位图文件以DIB为后缀名。

 

文件结构:

  位图文件由 文件表头(bitmap file header)、信息表头(bitmap info header)、[RGB色彩对照表]、位图图素位 这几部分组成。

下表为位图各部分的作用:


以下是位图的各个部分的结构:

文件表头:

typedef struct tagBITMAPFILEHEADER  // bmfh 

{

  WORD bfType ; // 位图文件的类型,必须为"BM"或者0x4D42

  DWORD bfSize ; // 位图文件的大小,以字节为单位。

  WORD bfReserved1 ; // 位图文件保留字,必须为0

  WORD bfReserved2 ; // 位图文件保留字,必须为0

  DWORD bfOffsetBits ; // 位图数据的起始位置

              // (与位图文件头部的偏移量)

} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

 

信息表头:

typedef struct tagBITMAPINFOHEADER // bmih

  DWORD biSize ; // 本结构所占用字节数

  LONG biWidth ; // 位图的宽度,以像素为单位。

  LONG biHeight ; // 位图的高度,以像素为单位。

  WORD biPlanes ; // = 1

  WORD biBitCount ; // 每一图素的位数 (1, 4, 8, 16, 24, or 32)

             // 1代表2色DIB、4代表16色DIB、

             // 8代表256色DIB、24代表真彩DIB

  DWORD biCompression ; // 位图压缩类型,必须是0(BI_RGB不压缩)、

               // 1(BI_RLE8压缩类型)或者2(BI_RLE4压缩类型)

  DWORD biSizeImage ; // 位图的大小,以字节为单位

  LONG biXPelsPerMeter ;// 位图水平分辨率

  LONG biYPelsPerMeter ;// 位图垂直分辨率

  DWORD biClrUsed ; // 彩色对照表中的颜色数

  DWORD biClrImportant; // 位图显示过程中重要的颜色数

} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

 

彩色对照表:

  当位数为1、4和8时的彩色对照表,24位DIB没有色彩对照表。(扩展的DIB)

typedef struct tagRGBQUAD // rgb

{

  BYTE rgbBlue ; // 蓝色色值

  BYTE rgbGreen ; // 绿色色值

  BYTE rgbRed ; // 红色色值

  BYTE rgbReserved ; // = 0

} RGBQUAD ;

 

除了包括总是设定为0的第四个字段外,wingdi.h表头文件还定义了如下结构:

typedef struct tagBITMAPINFO // bmi

{

  BITMAPINFOHEADER bmiHeader ; // 位图信息头

  RGBQUAD bmiColors[1] ; // 颜色表数组

} BITMAPINFO, *PBITMAPINFO ;

 

位图图素位:

  位图图素位记录了每一个像素值;值得注意的是,位图的行组织是从左到右,从下到上的。

  DIB中的行数等于BITMAPINFOHEADER结构的biHeight字段。每一行的图素数等于该结构的biWidth字段。每一行从最左边的图素开始,直到图像的右边。每个图素的位数可以从bcBitCount字段取得,为1、4、8或24。

行的长度可以计算为:RowLength = 4 * ((biWidth * biBitCount + 31) / 32); 或者 RowLength = ((biWidth * biBitCount + 31) & ~31) >> 3;

每行的长度必须是4的整数倍,当不足4时,通常用0填充。