位图文件的格式:
① 位图文件头,所用结构体:BITMAPFILEHEADER,占14个字节
② 位图信息头,所用结构体:BITMAPINFOHEADER,占40个字节
③ 颜色表项,所用结构体:RGBQUAD,由biBitCount值决定
④ 数据区,当结构体BITMAPINFOHEADER中的成员变量
biBitCount = 1时,1个字节代表8个像素;
biBitCount = 2时,1个字节代表2个像素;
biBitCount = 8时,1个字节代表1个像素;
biBitCount = 16时,2个字节代表1个像素;
biBitCount = 24时,3个字节代表1个像素;
RGBQUAD结构体的定义如下:
typedef struct tagRGBQUAD { BYTE rgbBlue; // 蓝色分量 BYTE rgbGreen; // 绿色分量 BYTE rgbRed; // 红色分量 BYTE rgbReserved; // 保留值,必须为0. } RGBQUAD;
即一个RGBQUAD结构体占4个字节,
当biBitCount = 1,2, 4, 8时,颜色表项分别占2, 4, 16,256个RGBQUAD结构体大小的空间;
当biBitCount = 24时,③颜色表项不占空间,即位图文件只有①②④三项,这是因为数据区中3个字节代表一个像素,本身含有三原色分量值。
需要注意的问题:
1. bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;
2. bmp文件存储的图片数据每行所占的字节数都是4的整数倍,不够的用0补充,所以有
biSizeImage = ((((bi.Width*bitBitCount)+31)&~31)/8)*bi.biHeight
3. 对于24位bmp文件,若图片每行像素所占字节数满足是4的整数倍这个条件,由于BITMAPFILEHEADER和BITMAPINFOHEADER所占的总字节数为54,不是4的倍数,所以补0后为56字节。
个人理解:
bibitcount 为1,2,4,8 代表着每个像素点的色彩深度为 2^n , 即每个像素点需要去参考的colortable深度分别为 2, 4 , 16, 256 ,通俗来讲,bibitcount为 8 ,那它像素点的深度就是256,如果此时它的像素点值是127, 那就要从colortable中去查找,colortable的大小就呼之欲出。
其次对于不同的bitmap,可以通过windows系统自带的画图来进行编辑,编辑之后保存的时候可以选择如下: