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填充。