BMP文件构成

  • 格式:docx
  • 大小:20.56 KB
  • 文档页数:2

BMP文件构成

BMP格式:这是一种常用的数字影像格式,一个BMP文件大体上分成如下4个部分:BITMAPFILEHEADER(位图文件头)、BITMAPINFOHEADER(位图信息头)、Palette(调色版)、DIB Pixels(DIB图像数据)。

第一部分:位图文件头BITMAPFILEHEADER,它是一个结构

typedef struct tagBITMAPFILEHEADER{

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

}BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER;

该结构的长度是固定的,为14个字节,各参数说明如下:

bfType:指定文件类型,必须是0x424D,即字符串“BM”。也就是说所有的“.bmp”文件的头两个字节都是“BM”

bfSize:指定文件大小;

bfReserved1、bfReserved2:为保留字,不用考虑;

bfOffBits:为文件头到实际的位图数据的偏移字节数,也就是前三部分长度之和。

第二部分:位图信息头BITMAPINFOHEADER

typedef struct tagBITMAPINFOHEADER{

DWORD bfSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPersPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

}BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER;该结构的长度为40个节,各参数的意义说明如下:

biSize:指定这个结构的大小,为40个字节;

biWidth:指定图像的宽度,单位是像素;

biHeight:指定图像的高度,单位是像素;

biPlanes:必须是1;

biBitCount:指定表示颜色要用到的位数,常用的值1(黑白)8(256色)、24(真彩色);

biCompression:指定位图是否压缩,有效值为BI_RGB、BI_RLE4、BI_RLE8。其中BI_RGB为不压缩的情况。

biSizeImage;指定实际的位图数据占用的字节数。可以用下面的公式计算:

需要注意的是:上述公式中的'biWidth 不一定总等于biWidth,'biWidth必须是4的整数倍,表示大于或等于biWidth的离4最近的整倍数。

biXPelsPerMeter:指定目标设备的水平分辨率,单位是每米的像素个数;

biYPelsPerMeter;指定目标设备的垂直分辨率,单位是每米的像素个数;

biClrUsed:指定本图像实际用到的颜色数,如果该值为0则用到的颜色数为2的biBitCount次幂;

biClrImportant:指定本图像中重要的颜色数,如果该值为零,则认为所用的颜色都是重要的。

第三部分:Palette(调色板)调色板实际上是一个数组,共有biClrUsed(颜色数)个元素(如果该值为0,则为2的biBitCount次幂)。数组中每个元素(颜色)的类型为一个RGBQUAD结构,占4个字节。结构定义如下:

typedef struct tagRGBQUAD{

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

}RGBQUAD;

注意:有些位图,比如真彩色图,没有调色板。他们的位图信息头(BITMAPINFOHEADER)后直接是DIB数据。

第四部分:DIB图像数据分两种情况:对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值;对于真彩色图,图像数据就是实际的R、G、B值。

对于2色位图,用1位就可以表示该像素的颜色,因此一个字节可以表示8个像素;

对于16色位图,用4位可以表示一个像素的颜色,所以1个字节可以表示2个像素;

对于256色位图,一个字节刚好表示一个像素;

对于真彩色图,3个字节才能表示1个像素

注意:1. 每一行的字节数必须是4的整倍数,如果不是,则需要补齐;

2. 图像数据是按照从上到下、从左到右的顺序存储;我们最先读到的是图像最下面一行的左边第一个像素,然后是左边第二个像素接下来是倒数第二行左边第一个像素,左第二个像素依此类推,最后得到的是最上面一行的最后一个像素。

ImbiSizeagebiWidthbiHeight