5.2 BMP文件
BMP(全称Bitmap)是Windows操作系统标准图像文件格式,使用较为广泛,其文件后缀名为“.bmp”。BMP文件采用位映射存储格式,除了图像深度可选(1位、4位、8位及24位)外,通常不采用其他任何压缩,因此它所占用的空间很大。
位图常分为与设备相关位图(Device Dependent Bitmap, DDB)和与设备无关位图(Device Independent Bitmap, DIB)两大类。DDB位图常见于早期的Windows系统(Windows 3.0以前)中。随着显示设备的多样化,DDB位图因其先天缺陷逐渐被淘汰。例如,由于它不能携带创建图像的原始设备的色彩信息,因此其他显示设备就不能真实准确地显示图像的色彩信息。DIB位图携带图像创建时的颜色和尺寸等信息,可以在不同的显示设备上按照创建时的情况重现,因此目前DIB已经基本取代了DDB。
DIB位图文件由文件头(Bitmap File Header)、位图信息头(DIB Header)、调色板(Color Table)和图像数据(Image Data)4部分组成,图5-10显示了一种DIB位图文件的结构。位图文件头包含BMP图像文件的类型、文件大小及图像数据起始位置相对于位图文件头的偏移(以字节数形式体现)。若用C语言来描述,位图文件头数据结构可定义为
位图信息头部分包含图像的分辨率、宽、高、压缩方式以及显示颜色等信息。位图信息头的数据结构可以用C语言定义为
调色板只在像素位深度为1位、4位和8位时存在。在这种情况下,它以表格形式包含了各种用于显示的图像颜色,而图像数据中只存放调色板中相应颜色的索引。调色板中每一个色彩都用一个RGBQUAD类型的数据来描述,该数据类型可以用C语言描述如下:
图5-10 BMP文件结构
调色板中RGBQUAD数据的个数由位图信息头中表示位深度的biBitCount的值来确定。当biBitCount为1、4、8时,调色板中分别有2、16或256种颜色,且一般将最重要的颜色排在前面。由于24位真彩色位图直接使用3个字节代表像素的RGB值,因此当biBitCount=24时,并不需要调色板。
位图信息头和调色板组合在一起统称为位图信息BITMAPINFO,其数据结构可用C语言描述为
图像数据部分按照从左到右、从下到上的顺序记录位图的每一个像素值。也就是说位图数据行的存储次序是颠倒的,即位图中的第一行对应的是位图文件中的最底行。像素数据以行为单位存储,且每行数据所占的存储长度总是被调整到4B(32b)的整数倍。如果某行数据不足4B的整倍数,会将不足的位用0填充。
位图中单个像素的颜色值或其在调色板中的索引所占的字节数与像素的位深度相关。例如,biBitCount=1时,每字节可以包含8个像素颜色值索引,此时字节的最高位对应于最左边的像素;biBitCount=4时,每字节可包含2个像素的索引;biBitCount=8时,单个像素颜色索引就占1个字节;biBitCount=24时,每个像素颜色则直接用3个字节表示,从左到右的每一字节分别存储蓝、绿、红的颜色值。
BITMAPINFOHEADER中的biClrUsed字段表示位图实际用到的颜色数量。如果它的值不为0,则代表调色板中实际包含的颜色个数;而如果其值为0,则代表调色板中颜色数为位深度的满量程(如位深度为4位时,表示包含16种颜色)或调色板不存在(对应24位真彩色图像)。DIB位图数据可以压缩也可以不压缩。4位和8位位图,可以采用游程长度编码(Run-Length Encoded, RLE)进行压缩。编码后的位图相应称为RLE4和RLE8位图。
NI Vision提供的图像文件操作函数封装了大多数文件保存操作的细节,但仍保留了调色板(Color Palette)和压缩(Compress)参数让开发人员对图像文件保存过程进行控制。在LabVIEW中读写位图文件时,可以无须考虑保存操作的细节,就能轻松进行文件读写(参见5.2节程序代码)。需要注意的是NI Vision会将8位以下位深度的图像转换为8位位深度进行来操作,在计算机处理和存储能力飞速发展的今天,以这种方式处理已经不会对程序运行效率带来太大影响。此外,BMP位图并不支持1位、4位、8位及24位以外的位深度,若要以其他位深度存储图像数据,则需要选择诸如PNG之类的图像文件类型。