位图文件
简介
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:
位图文件头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字节的边界。