文件格式
典型的BMP图像文件由四部分组成。
1. 位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2. 位图信息结构体,它包含有BMP图像的宽、高、压缩方法以及定义颜色等信息;
3. 调色板,这部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24 bits的BMP)就不需要调色板。
4. 位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其它小于24位的使用调色板中颜色所引用值。
在默认字节对齐方式下,这样读取BMP图像会出现错误。由于系统默认情况下,结构体以4字节对齐,这样,对于结构体中不够4字节的字段,会自动填充,使得其也占据4个字节。对于像BMP图像这样采用1字节保存的文件,读取就会出错。
位图文件主要分为如下4个部分:
块名称 对应Windows结构体定义 大小(Byte)
文件信息头BITMAPFILEHEADER 14
位图信息头BITMAPINFOHEADER 40
颜色表(调色板)RGBQUAD (option)
位图数据(RGB颜色阵列)BYTE* 由图像长宽尺寸决定
BITMAPFILEHEADER 中的重点参数说明:
bfOffBits 表示从文件头开始到实际的图像数据之间的字节的偏移量。
BITMAPINFOHEADER中的重点参数说明:
biHeight 表示图像的高度,以像素为单位。这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
图像真正的数据,比如一张图像的大小为800*600,则该部分数据的长度就应该是800*600像素,也即800*600*24/8字节(如果是24位的图片,即一个像素用24bit来存储,每个像素点上有3个字节,分别用来表示b, g, r的颜色)。
在Windows下,RGB颜色阵列存储的格式其实是BGR。对32为的RGB位图像素数据是BGRA。A表示透明通道Alpha通道,该值是该像素点的透明属性,取值在0(不透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。
字节对齐:
位图数据记录了位图的每一个像素值,记录顺序是:扫描行内是从左到右,扫描行之间是从下到上。且Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,所以向文件中写入的位图数据的大小应该为:
每行图像的字节数: bmppitch = ((biWidth * bitCountPerPix + 31) >> 5) << 2;
biWidth --- 图像的宽度,bitCountPerPix --- 图像的位数