您好,欢迎访问三七文档
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependentbitmap,DDB)文件格式。Windows3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independentbitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名是BMP或者bmp。6.1.2文件结构位图文件可看成由4个部分组成:位图文件头(bitmap-fileheader)、位图信息头(bitmap-informationheader)、彩色表(colortable)和定义位图的字节阵列,它们的名称和符号如表6-01所示。表6-01BMP图像文件组成部分的名称和符号位图文件的组成结构名称符号位图文件头(bitmap-fileheader)BITMAPFILEHEADERbmfh位图信息头(bitmap-informationheader)BITMAPINFOHEADERbmih彩色表(colortable)RGBQUADaColors[]图像数据阵列字节BYTEaBitmapBits[]位图文件结构可综合在表6-02中。表6-02位图文件结构内容摘要偏移量域的名称大小内容图像文件头0000h标识符(Identifier)2bytes两字节的内容用来识别位图的类型:‘BM’:Windows3.1x,95,NT,linux‘BA’:OS/2BitmapArray‘CI’:OS/2ColorIcon‘CP’:OS/2ColorPointer‘IC’:OS/2Icon‘PT’:OS/2Pointer0002hFileSize1dword用字节表示的整个文件的大小0006hReserved1dword保留,设置为0000AhBitmapDataOffset1dword从文件开始到位图数据开始之间的数据(bitmapdata)之间的偏移量000EhBitmapHeaderSize1dword位图信息头(BitmapInfoHeader)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:28h-Windows3.1x,95,NT,…0Ch-OS/21.xF0h-OS/22.x0012hWidth1dword位图的宽度,以像素为单位0016hHeight1dword位图的高度,以像素为单位001AhPlanes1word位图的位面数图像001ChBitsPerPixel1word每个像素的位数1-Monochromebitmap信息头4-16colorbitmap8-256colorbitmap16-16bit(highcolor)bitmap24-24bit(truecolor)bitmap32-32bit(truecolor)bitmap001EhCompression1dword压缩说明:0-none(也使用BI_RGB表示)1-RLE8-bit/pixel(也使用BI_RLE4表示)2-RLE4-bit/pixel(也使用BI_RLE8表示)3-Bitfields(也使用BI_BITFIELDS表示)0022hBitmapDataSize1dword用字节数表示的位图数据的大小。该数必须是4的倍数0026hHResolution1dword用像素/米表示的水平分辨率002AhVResolution1dword用像素/米表示的垂直分辨率002EhColors1dword位图使用的颜色数。如8-位/像素表示为100h或者256.0032hImportantColors1dword指定重要的颜色数。当该域的值等于颜色数时,表示所有颜色都一样重要调色板数据0036hPaletteN*4byte调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:1字节用于蓝色分量1字节用于绿色分量1字节用于红色分量1字节用于填充符(设置为0)图像数据0436hBitmapDataxbytes该域的大小取决于压缩方法,它包含所有的位图数据字节,这些数据实际就是彩色调色板的索引号6.1.3构件详解1.位图文件头位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义:typedefstructtagBITMAPFILEHEADER{/*bmfh*/UINTbfType;DWORDbfSize;UINTbfReserved1;UINTbfReserved2;DWORDbfOffBits;}BITMAPFILEHEADER;其中:bfType说明文件的类型.bfSize说明文件的大小,用字节为单位bfReserved1保留,设置为0bfReserved2保留,设置为0bfOffBits说明从BITMAPFILEHEADER结构开始到实际的图像数据之间的字节偏移量2.位图信息头位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-informationheader)和彩色表(colortable)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。BITMAPINFO结构具有如下形式:typedefstructtagBITMAPINFO{/*bmi*/BITMAPINFOHEADERbmiHeader;RGBQUADbmiColors[1];}BITMAPINFO;其中:bmiHeader说明BITMAPINFOHEADER结构bmiColors说明彩色表RGBQUAD结构的阵列BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:typedefstructtagBITMAPINFOHEADER{/*bmih*/DWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbiPlanes;WORDbiBitCount;DWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;}BITMAPINFOHEADER;其中:biSize说明BITMAPINFOHEADER结构所需要的字节数biWidth说明图像的宽度,以像素为单位biHeight说明图像的高度,以像素为单位biPlanes为目标设备说明位面数,其值设置为1biBitCount说明位数/像素,其值为1、2、4或者24biCompression说明图像数据压缩的类型。其值可以是下述值之一:BI_RGB:没有压缩;BI_RLE8:每个像素8位的RLE压缩编码,压缩格式由2字节组成(重复像素计数和颜色索引);BI_RLE4:每个像素4位的RLE压缩编码,压缩格式由2字节组成biSizeImage说明图像的大小,以字节为单位。当用BI_RGB格式时,可设置为0biXPelsPerMeter说明水平分辨率,用像素/米表示biYPelsPerMeter说明垂直分辨率,用像素/米表示biClrUsed说明位图实际使用的彩色表中的颜色索引数biClrImportant说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。现就BITMAPINFOHEADER结构作如下说明:(1)彩色表的定位应用程序可使用存储在biSize成员中的信息来查找在BITMAPINFO结构中的彩色表,如下所示:pColor=((LPSTR)pBitmapInfo+(WORD)(pBitmapInfo-bmiHeader.biSize))(2)biBitCountbiBitCount=1表示位图最多有两种颜色,黑色和白色。图像数据阵列中的每一位表示一个像素。biBitCount=4表示位图最多有16种颜色。每个像素用4位表示,并用这4位作为彩色表的表项来查找该像素的颜色。例如,如果位图中的第一个字节为0x1F,它表示有两个像素,第一像素的颜色就在彩色表的第2表项中查找,而第二个像素的颜色就在彩色表的第16表项中查找。biBitCount=8表示位图最多有256种颜色。每个像素用8位表示,并用这8位作为彩色表的表项来查找该像素的颜色。例如,如果位图中的第一个字节为0x1F,这个像素的颜色就在彩色表的第32表项中查找。biBitCount=24表示位图最多有224=16777216种颜色。bmiColors(或者bmciColors)成员就为NULL。每3个字节代表一个像素,其颜色有R、G、B字节的相对强度决定。(3)ClrUsedBITMAPINFOHEADER结构中的成员ClrUsed指定实际使用的颜色数目。如果ClrUsed设置成0,位图使用的颜色数目就等于biBitCount成员中的数目。(4)图像数据压缩①BI_RLE8:每个像素为8位的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式可在同一幅图中的任何地方使用。编码方式:由2个字节组成,第一个字节指定使用相同颜色的像素数目,第二个字节指定使用的颜色索引。此外,这个字节对中的第一个字节可设置为0,联合使用第二个字节的值表示:第二个字节的值为0:行的结束。第二个字节的值为1:图像结束。第二个字节的值为2:其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量。绝对方式:第一个字节设置为0,而第二个字节设置为0x03~0xFF之间的一个值。在这种方式中,第二个字节表示跟在这个字节后面的字节数,每个字节包含单个像素的颜色索引。压缩数据格式需要字边界(wordboundary)对齐。[例6.1]用十六进制表示的8位压缩图像数据如下:0304050600034556670002780002050102780000091E0001这些压缩数据可解释为:压缩数据扩展数据0304040404050606060606060003455667004556670278787800020501从当前位置右移5个位置后向下移一行027878780000行结束091E1E1E1E1E1E1E1E1E1E0001RLE编码图像结束②BI_RLE4:每个像素为4位的RLE压缩编码,同样也可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式也可在同一幅图中的任何地方使用。这两种方式是:编码方式:由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引,一个在高4位,另一个在低4位。第一个像素使用高4位的颜色索引,第二个使用低4位的颜色索引,第3个使用高4位的颜色索引,依此类推。绝对方式:这个字节对中的第一个字节设置为0,第二个字节包含有颜色索引数,其后续字节包含有颜色索引,颜色索引存放在该字节的高、低4位中,一个颜色索引对应一个像素。此外,BI_RLE4也同样联合使用第二个字节中的值表示:第二个字节的值为0:行的结束。第二个字节的值为1:图像结束。第二个字节的值为2:其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量。[例6.2]用十六进制数表示的4位压缩图像数据:0304050600064556670004780002050104780000091E0001这些压缩数据可解释为:压缩数据扩展数据03040400506060600006455667004556670478787800020501从当前位置右移5个位置后向下移一行047878780000行结束091E1E1E1E1E10001RLE图像结束3.彩色表彩色表包含的元素与位图所具有的颜色数相同,像素的颜色用RGBQUAD结构来定义。对于24-位真彩色图像就不使用彩色表,因为位图中的RGB值就代表了每个像
本文标题:BMP格式结构详解
链接地址:https://www.777doc.com/doc-2900719 .html