位图是Windows及其他系统上经常用到的图片类型。既然要处理位图,先得认清什么是位图。下面介绍一下位图的结构。
位图的后缀名通常为.bmp,即Bitmap的缩写。其中bit是比特位的意思,map不是地图,而是映射的意思。
位图通常由四个部分组成。如图:
1.BITMAPFILEHEADER结构的定义如下:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //指定文件类型,必须是“BM”(0x4D42)
DWORD bfSize; //指定位图文件的大小,以字节表示
WORD bfReserved1; //保留字,必须为0
WORD bfReserved2; //保留字,必须为0
DWORD bfOffBits; //指定从实际位图数据到文件头起始位置的偏移量,以字节表示
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
2.BITMAPINFOHEADER结构的定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //表示本结构的大小,以字节表示
LONG biWidth; //位图的宽度,单位为像素
LONG biHeight; //位图的高度,单位为像素
WORD biPlanes; //设备上颜色平面数目,必须为1
WORD biBitCount; //储存每个像素所使用的位数
DWORD biCompression; //是否压缩存储图像数据
DWORD biSizeImage; //表示位图数据区域的大小,以字节为单位
LONG biXPelsPerMeter; //图像的水平分辨率,单位是像素每米
LONG biYPelsPerMeter; //图像的垂直分辨率,单位是像素每米
DWORD biClrUsed; //图像中实际使用了颜色索引表中的多少种颜色
DWORD biClrImportant; //图像中重要的颜色数,如果为0,则所有颜色都重要
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
重要成员参数解释:
biBitCount: 指定存储每个像素使用的二进制位的位数,间接确定图像中可能出现的最大颜色数目。可取1、4、8、16、24、32,其含义见下文讲解
biSizeImage: 指定图像的大小(以字节为单位)。biSizeImage = biWidth‘ x biHeight,其中 biWidth' 是图像每行占用的字节数,
与实际宽度 biWidth 不同,biWidth' 必须是4的整数倍,即大于或等于biWidth, 最接近 4 的整倍数。如 biWidth = 401,则 biWidth' = 404。
如果biCompression 为 BI_RGB,则该项可能为零。
biClrUsed: 指定位图图像中实际使用的颜色数。如果为零,则图中实际使用的颜色数是 2 的 biBitCount次方。
如黑白双色图的颜色数是黑和白两种,即 biClrUsed = 2 ^ biBitCount。
---------------------------------------------------------------------
这里还需要知道另外一种结构BITMAPINFO结构:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; //BITMAPINFOHEADER结构
RGBQUAD bmiColors[n]; //调色板,其中n不确定,比如8位的位图这里的n就为256,代表颜色的数目,RGBQUAD是个像素的结构体,会在下面讲到
} BITMAPINFO, *PBITMAPINFO;
---------------------------------------------------------------------
biBitCount可取1(2色)、4(16色)、8(256色)、16(64K色,高彩色)、24(16M色,真彩色)、32(4096M色,增强型真彩色)这6种,分别对应BMP图像允许的6中颜色模式。
注意:对于 BMP文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么
庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16
色图像采用RLE4压缩算法,256 色图像采用RLE8压缩算法。
有些位图需要调色板,而真彩色不需要,它们的BITMAPINFOHEADER后面直接是位图数据
typedef struct tagRGBQUAD {
BYTE rgbBlue; //蓝色分量
BYTE rgbGreen; //绿色分量
BYTE rgbRed; //红色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
4.位图数据
位图数据是一片连续的存储区域,其中保留着图像中每个像素的灰度(颜色),有的是保存的调色板索引(如2位、8位等低于24位的位图),有的直接保存的是BGR的三个分量(如24为真彩色图)。
这里需要注意的是,位图数据在文件中的每个像素是BGR的顺序存储的,而不是RGB存储的。
同时需要知道的是,位图数据的读取是从下至上,从左至右的,即最先读取最后一行的左边的第一个像素,然后再读取最后一行的左边第二个像素……
位图的结构大概就是这样。如需其他信息,请参考MSDN或者Google。