位图文件
简介
BMP(Bitmap-File)格式是最常用的图像文件存取格式之一,是微软为其Windows环境设置的标准图像格式,BMP位图文件默认的文件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。用BMP格式存放的图像几乎可以被所有的图像显示软件读取。
BMP图形文件是Windows采用的图像文件格式,在Windows环境下运行的所有图像软件都支持BMP图像文件格式。Windows系统内部个图像绘制操作都是以BMP为基础的。Windows3.0以前的BMP文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图(Device Dependent Bitmap,DDB)文件格式。Windows3.0以后的BMP文件都与显示设备无关,因此把这种BMP文件格式称为设备无关位图(Device Independent Bitmap,DIB)格式。
BMP文件格式
摘要
每个BMP文件只能存放一张图像。图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理是BMP图像文件的一个选项,用户可以根据需要进行选择。
其中,非压缩格式是BMP图像文件所采用的一种通用格式,它按照一定的顺序忠实的记录图像中每一个像素的颜色值。如果用户确定将BMP文件格式压缩处理,则Windows设计了一种压缩方式:如果位图为16色模式,则采用RLE4压缩方式,如果图像为256色模式,则采用RLE8压缩方式。
BMP图像数据文件格式可以存储为单色,16色,256色和真彩色四种图像数据,其数据的排列顺序与一般文件不同,它以图像的左下角作为起点存储图像,而不是以图像的坐上角为起点。而且BMP图像文件格式中还存在另外一个与众不同的特点,即其调色板数据所采用的数据结构中,红,绿,蓝三种基色数据的排列顺序也恰好与其他图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境的新特色,而且随着Windows版本的不断更新,微软也在不断的改进BMP图像文件格式。
BMP中包含的域
BMP位图文件是由四个部分组成:位图文件头(bitmap-file header),位图信息头(bitmap-information header),调色板(color table)和定义位图的字节阵列(图像数据阵列)。其对应的结构体或类型分别为:BITMAPFILEHEADER,BITMAPINFOHEADER,RGBQUAD,BYTE。
1. 位图文件头
位图文件头BITMAPFILEHEADER:
偏移 | 域的名称 | 长度/字节 | 内容 |
0000h(0) | bfType | 2 | 两字节的内容用来识别位图的类型,存储的是两个字符的ASCII码。 BM(0x4D42):Windows BA/CT/CP/IC/PT: OS/2 |
0002h(2) | bfSize | 4 | 整个文件的大小 |
0006h(6) | bfReserved1 | 2 | 保留未用,必须为0 |
0008h(8) | bfReserved2 | 2 | 保留未用,必须为0 |
000Ah(10) | bfOffBits | 4 | 从文件开头到图像数据开始之间的字节数,有了该数据能方便地跳过位图的信息头 |
2. 位图信息头BITMAPINFOHEADER
偏移 | 域的名称 | 长度/字节 | 内容 |
000Eh(14) | biSize | 4 | 文件信息头的长度 40(28h):Windows |
00012h(18) | biWidth | 4 | 位图的宽度,以像素为单位 |
00016h(22) | biHeight | 4 | 位图的高度,以像素为点为 |
001Ah(26) | Biplanes | 2 | 位图的为平面数(该值总是为1) |
001Ch(28) | biBitCount | 2 | 每个像素的位平面数,有下面几种情况: 1:单色位图 4:16色位图 8:256色位图 16:16bit高彩色位图 24:24bit真彩色位图 32:32bit增强型真彩色位图 |
001Eh(30) | biCompression | 4 | 压缩说明: 0:不压缩(用BI_RGB表示) 1:RLE8,使用8位RLE压缩方式(用BI_RLE8表示) 2:RLE4,使用4位RLE压缩方式(用BI_RLE4表示) 3:Bitfields:位域存放方式(用BI_BITFIELDS表示) |
0022h(34) | biSizeImage | 4 | 位图数据的大小,以字节为单位。该数必须是4的倍数。当图像存储的是非压缩数据的时候,它的取值可以为0,实际上,此时位图数据的大小可以通过biBitCount,biWidth,biHeight等计算出来 |
0026h(38) | biXPelsPerMeter | 4 | 用像素/米表示的水平分辨率 |
002Ah(42) | biYPelsPerMeter | 4 | 用像素/米表示的垂直分辨率 |
002Eh(46) | biClrUsed | 4 | 位图使用的颜色数,如果为0则表示使用了全部可能的颜色 |
0032h(50) | biClrImportant | 4 | 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要 |
3. 调色板
调色板又叫彩色映像表,使用每个像素为1,4或者8为的图像必须有一个调色板,相对应的调色板的大小分别为2,16或者256个表项。如果图像没有使用相对应的全部颜色,则调色板仅记录使用过的颜色,此时调色板会小一些。也就是说,如果位图信息头中的biClrUsed字段非零,则它记录的是使用的颜色数目,同时它也是彩色映像的表项号码。若该字段为0则彩色映像为全大小,也就是说色深为1,4,8的图像,调色板分别具有2,16,256个表项。
对于16为和24为的图像,没有调色板,图像是直接RGB彩色,此时biClrUsed字段不为0,以提供一个建议的调色板大小,不过并没有多少实际意义。
由于显示设备可能不具备图像所需的那么多的颜色,因此彩色映像中的表项在排列顺序应该是最重要的颜色排在前面。位图信息头中的biClrImportant字段如果不为0,则指出了对于好的图像重新生成多少种颜色是重要的。
彩色映像表RGBQUAD结构定义:
偏移 | 域的名称 | 长度/字节 | 内容 |
0 | rgbBlue | 1 | 调色板项的蓝色值 |
1 | rgbGreen | 1 | 调色板项的绿色值 |
2 | rgbRed | 1 | 调色板项的红色值 |
3 | rgbReserved | 1 | 保留未用,必须为0 |
4. 图像数据阵列
紧跟在调色板之后的是图像数据阵列,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可以是实际的RGB值。
图像的每一扫描行由表示图像像素的连续的字节组成,每一个扫描行对应的字节数取决于图像的色深和图像的宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位于左下角的像素,而最后一个字节表示位图右上角的像素。
图像数据中的阵列可以是压缩的,也可以是不压缩的:每个像素可以用一位表示,也可以用32位表示,这些都是由前面讲过相关字段决定。下面分别说明不同色深的位图中图像数据阵列到底是如何排列的。
(1) 色深1位的位图
每个像素只用一位表示,每个字节可以表示8个像素,字节中的最高位对应于最左边的像素。
(2) 色深4位的位图
对没有压缩的图像,每个字节可以表示2个像素,高4位为左边的像素,且每行填充到一个4字节的边界上。
(3) 色深8位的位图
对没有压缩的图像,每个字节表示一个像素。每行填充到4字节边界。
(4) 色深24位的位图
每个像素用3个字节表示,顺序依次为红,绿和蓝的值。每行用0填充到4字节的边界。