5.5 PNG文件
PNG(Portable Network Graphic)格式是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。使用PNG格式来存储灰度图像时,图像的位深度可达16位;存储彩色图像时,图像的深度可多达48位,并且还可存储多达16位的Alpha通道数据。PNG图像与硬件设备无关,且可在一个文件中保存多幅图像。PNG使用从LZ77派生的无损数据压缩算法,而且还可以在不损伤图像数据的前提下,保存一些图像需要的文本辅助信息。
PNG文件格式保留了GIF文件格式的以下特性:
支持8位调色板(256种颜色)。
支持流式读写方式(streamability)。图像文件格式允许连续读出和写入图像数据,这个特性适合于在通信过程中生成和显示图像。
支持逐次逼近显示(progressive display)。这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
支持透明性(transparency)。这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
支持辅助信息(ancillary information)。这个特性可用来在图像文件中存储一些文本注释信息。
PNG文件格式中增加了下列GIF文件格式所没有的特性:
每个像素可使用多达48位来表示真彩色。
每个像素可使用多达16位来表示灰度。
可为灰度图和真彩色图添加Alpha通道。
可保存图像的Gamma信息。
使用循环冗余码校验(Cyclic Redundancy Code, CRC)检测损害的文件。
加快图像显示的逐次逼近显示方式。
标准的读/写工具包。
可在一个文件中存储多幅图像。
PNG图像格式文件由PNG文件署名域(PNG File Signature)和按照特定结构组织的数据块(chunk)组成。PNG文件署名用来识别该文件是不是PNG文件,它共包含8个字节,如表5-7所示。
表5-7 PNG文件署名结构
PNG定义了关键数据块(Critical Chunk)和辅助数据块(Ancillary Chunk)两种类型的数据块。关键数据块为标准的数据块,它定义了PNG文件必须包含的标准数据块,PNG读写软件也都必须支持这些数据块。辅助数据块为可选的数据块,虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。PNG文件中每个数据块的结构如表5-8所示。
表5-8 PNG数据块结构
PNG格式共定义了4种标准的关键数据块:图像头数据块(Image Header Chunk, IHDR)、调色板数据块(Palette Chunk, PLTE)、图像数据块(Image Data Chunk, IDAT)和图像结束数据块(Image Trailer Chunk, IEND)。调色板数据块PLTE对于索引彩色图像来说必须存在,而对于真彩色图像或带Alpha通道数据的真彩色图像来说为可选。当图像为灰度图时,它没有存在的意义。
图像头数据块(IHDR)包含PNG文件中存储的图像数据的基本信息。它必须作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块由13个字节组成,它的格式如表5-9所示。
表5-9 图像头数据块(IHDR)结构
调色板数据块(PLTE)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(IDAT)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表5-10所示。
表5-10 调色板数据块(PLTE)结构
图像数据块(IDAT)用来存储实际的图像数据,在PNG数据流中可包含多个连续顺序的图像数据块。图像结束数据(IEND)用来标记PNG文件或者数据流已经结束,它必须放在文件的尾部。除了表示数据块开始的IHDR必须放在最前面,表示PNG文件结束的IEND放在最后面之外,其他数据块的存放顺序并没有严格限制。
除了4个标准的关键数据块外,PNG文件格式规范还制定了10个辅助数据块和一些专用公共数据块(special-purpose public chunk)。表5-11汇总了这些数据块的符号、特性及位置限制。PNG不仅支持较高的像素分辨率,适合传输,数据组织方式灵活,而且还是目前为数不多的开源文件格式。
表5-11 PNG的数据块
虽然PNG文件格有很多重要的细节,但是NI Vision的文件读写VI却封装了对这些细节的处理,使得开发人员读写PNG文件时可不必关心这些细节。NI Vision处理PNG图像文件的读写与处理其他图像文件读写的方法类似,也是使用IMAQ Write File 2对PNG图像文件读写的实例来处理。该实例也用Image Quality参数指定对图像压缩的情况,它的值从0~1000可选,数值越大,图像质量越好,默认情况下该参数的值为750。例如,其中0级压缩比最高,图像品质最差,而1000级则图像的细节几乎无损。此外,如果要将16位有符号的图像保存到PNG文件中,NI Vision必须将数据转换为无符号类型并对数据进行移位,以确保最高位始终在最左。可以通过Use bit depth参数选择转换时是否使用IMAQ Image Bit Depth指定的位深度进行像素映射。若不使用位深度,则VI会先对所有像素值增加一个常量,使最小负像素值变为0,再根据结果中最大像素值进行像素移位,将所有像素转换为16位无符号类型值。
图5-13显示了使用IMAQ ReadFile和IMAQ Write File 2读写文件的例子。程序增加了检测PNG、BMP、JPEG、JPEG 2000和TIFF格式文件的功能,并能根据不同文件格式选择IMAQ Write File 2与该格式对应的实例保存图像文件。若所选文件为NI Vision不支持的图像文件格式,则程序将不做任何处理。当程序检测到选择的文件类型为PNG格式时,会先用IMAQ Write Custom Data为内存中的图像数据添加自定义文本信息,再试图将其连同图像数据保存到PNG文件。如果此时直接使用IMAQ Write PNG File 2,则只有图像数据会被存放至文件,而自定义文本并不会被保存。若要将两种信息均成功存放至PNG文件中,必须使用IMAQ Write Image And Vision Info File 2。
图5-13 支持文件格式检查的文件读写
PNG文件格式以数据块组织数据的方式赋予了它保存用户定义辅助信息的能力,这是其他几种常用图像文件格式不具备的。NI Vision提供的IMAQ Read Image And Vision Info和IMAQ Write Image And Vision Info File 2专门用来一并读写PNG文件中的图像数据和机器视觉信息。它们位于LabVIEW的Vision and Motion→Vision Utilities→Overlay函数选板中。多数情况下,机器视觉信息由程序中的图像处理VI生成,包括系统校准、灰度或彩色图像的模式匹配模板、无损图层、几何匹配模板、黄金匹配模板以及其他与图像关联的自定义数据等,而自定义数据则由IMAQ Write Custom Data事先添加到内存图像中。表5-12汇总了与图像中机器视觉信息和自定义数据操作相关的VI,需要注意IMAQ Read Image And Vision Info和IMAQ Write Image And Vision Info File 2两个VI用于图像文件的读写,而其他VI则基于内存中的图像数据进行操作。
表5-12 与图像中机器视觉信息和自定义数据操作相关的VI