转载请注明出处
BMP是bitmap的缩写,顾名思义,BITMAP就是位图,及windows位图,是一种未经过压缩的图像。其使用范围非常广泛,是windows环境中交换图像有关数据的一种标准。所以,在windows环境中运行的设备都支持BMP图像格式,并采用了为映射的格式储存。当用BMP文件存储数据结构时,图像的扫描顺序是按照从左到右,从下到上的顺序进行的(这对于读取BMP顺序是非常重要)。
BMP图像文件格式一般由文件头信息块(BITMAPFILEHEADER)、图像描述信息(BITMAPINFOHEDER)、颜色表(RGBQUAD)(真彩色模式下无该信息块)和图像数据四部分组成。
图像格式如下表所示:
BMP文件组成 |
数据结构表示 |
位图文件头 |
BITMAPFILEDEADER |
位图信息头 |
BITMAPINFOHEADER |
颜色信息 |
RGBQUAD |
位图数据 |
BYTE |
1. 位图文件头
位图文件头主要包括文件大小、文件类型、图像数据偏移文件头的长度等信息,其结构占14个字节,定义如下(来源于MSDN2011):
typedef struct tagBITMAPFILEHEADER{ WORD bfType; //占2个字节,文件类型,一般为“BM” DWORD bfSize; //占4个字节,位图文件的大小 WORD bfReserved1; //占2个字节,文件保留字1,0(一般用不到) WORD bfReserved2; //占2个字节,文件保留字2,0(一般用不到) DWORD bfOffBits; //占4个字节,图像数据偏移文件头的长度 } BITMAPFILEHEADER;
2. 位图信息头
位图信息头主要包括位图图像的大小、像素深度、图像是否压缩、图像所用眼色数等,其结构占用40个字节,定义如下:
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //该结构所需的字节数 LONG biWidth; //图像宽度,以像素为单位 LONG biHeight; //图像高度,以像素为单位 WORD biPlanes; //目标设备的平面数,设置为1 WORD biBitCount //每个像素所需的bit数。“1”表示单色图像;设置“4”,表示有16种颜色;设置为“8”,表示有256种颜色;设置为“24”就是真彩色图像,表示的颜色有16 777 216种颜色,且一个像素由3个像素表色,分别代表R,G,B分量。 DWORD biCompression; //位图的压缩类型,“0”表示未压缩 DWORD biSizeImage; //位图大小,以字节为单位 LONG biXPelsPerMeter; //水平分辨率 LONG biYPelsPerMeter; //垂直分辨率 DWORD biClrUsed; //实际使用颜色表中的颜色数 DWORD biClrImportant; //显示过程中主要的颜色数 } BITMAPINFOHEADER;
3. 颜色信息
颜色信息包含所要用到的颜色表,显示图像时需要这个表来生成调色板。但如果是一幅真彩色的图像,则没有这一块信息。颜色表中有若干个表项,每一项都是RGBQUAD类型的结构,定义一种颜色。其结构如下:
Thisstructure describes a color consisting of relative intensities of red, green,and blue.
typedef struct tagRGBQUAD { BYTE rgbBlue; //蓝色分量(0-255) BYTE rgbGreen; //绿色分量(0-255) BYTE rgbRed; //红色分量(0-255) BYTE rgbReserved;} //保留,“0” RGBQUAD;
4. 位图数据
文件中的位图数据表示图像相应的像素值。特别注意:第一,图像的像素值在文件中是按从左到右,从下到上的顺序存储的。也就是说,在BMP文件中首先存放的是图像的最后一行数据。第二,当存储图像的每一行的像素值时,如果存储该行像素值所占的字节数为4的倍数是,则正常存储,否则需要在后面补“0”,凑足4的倍数。
原文地址:http://blog.csdn.net/carvin_zh/article/details/45875277