标签存档: bitmap

BMP 文件格式学习

由于改进IMAGELIS的需要,我对BMP文件的格式进行了一些研究,写在这里做为学习笔记,也给需要的朋友做为参考。如果没有特别说明,我所用的位图文件都是由WinowXP自带的画图产生。

BMP文件格式在网上已经很多教程之类的,不过我这里讲的是一些它们没提到的。

1.数据区起始位置

我在网上找到许多有关BMP文件格式的说明都说数据区起始位置在相对文件开头51个字节处,但我却发现数据区起始在相关文件开头55个字节处,不知是网上的错了还是我错了,不过我这样用了好像也没出错,有空再研究研究。

2.像素保存顺序

位图保存时扫描顺序是从下至上,从左至右,即在位图数据区,位图第一行保存在位图数据区的最后,而位图最后一行保存在位图数据区的开始,例有一个4x4的位图,那么它有4行,4列,像素保存在数据区的顺序是这样的:

line3 pixel 0 1 2 3

line2 pixel 0 1 2 3

line1 pixel 0 1 2 3

line0 pixel 0 1 2 3

因此,如果我们要自己产生一个位图文件,那么保存时就应该从最后一行,第一个像素开始保存,保存好一行后就往上一行直到第一行保存完毕,当然,我们必须在位图数据之前加上位图文件头,文件头的格式可以在网上找资料。

3.行字节对齐

可能是为了数据区的读取更快速,BMP格式规定一行的字节数必须是4的倍数,如果不足,就用0补足。例如有一幅5x5的24位色位图,那么本来每一行的字节数是24/8*5=15个字节,但15不是4的倍数,还需要1个字节来补足,于是在数据区这一行的数据就是:

pixel 0 1 2 3 4 0x00

同理如果宽度是7那么就需要补3个字节等等。如果是12x12单色位图,那么一行有12/2=6个字节,就需要在每一行的数据的最后补2个字节。

这个补0的问题很多朋友在处理位图的时候没有注意,以致于程序在处理诸如32x32之类的位图时能很好的运行,而处理如31x32这样的就不行了。

4.颜色数少于256时的数据位

在颜色数少于256时一个字节里就可能保存1个或者更多个像素,这时就要注意像素在字节里的保存顺序了。像素在字节内保存的顺序原则是前面的像素在高位,后面的像素在低位。例:

在16色位图里,每一个像素需要4个bit来保存,因此1个字节里就保存了两个像素,假如有一个2x1的16色位图,第一个像素是黑色,数据是0x0,第二个像素白色,数据是0xF,那么根据上面的原则,这两个像素在字节里是这样保存的:

pixel 0      1

bits  0000 …

阅读全文 »