【数据压缩(二)】PNG文件格式分析

PNG文件格式

(一)概述

        PNG(可移植网络图形),是一种可扩展的文件格式,用于光栅图像的无损、可移植、压缩良好的存储。PNG是一种无损压缩的位图图形格式。其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG的名称来源于“可移植网络图形格式(Portable Network Graphic Format,PNG)”,也有一个非官方解释“PNG's Not GIF”。PNG使用从LZ77派生的无损数据压缩算法,由于其它压缩比高,生成文件体积小,一般应用于JAVA程序、网页或S60程序中[1]。

        PNG设计用于在线查看应用程序, 例如万维网,因此它可以通过渐进式显示选项完全流式传输。PNG 非常强大,既能提供完整的文件完整性检查,又能对常见传输错误进行简单检测。此外,PNG 还可以存储伽玛和色度数据,以改善异构平台上的颜色匹配[2]。

(二)PNG文件结构

        PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成[1]。

1、文件署名域

        PNG文件前八个字节始终包含以下值:

        

        前两个字节在期望前两个字节唯一标识文件的系统上区分文件。字节二到四(与前两个有意重叠)命名格式。CR-LF 序列捕获更改这些字符的错误文件传输。 control-Z 字符在 MSDOS 下停止文件显示。 最后的换行检查 CR-LF 转换问题的逆[2]。

2、数据块

        PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是必需的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块[1]。

【数据压缩(二)】PNG文件格式分析_第1张图片

1)关键数据块

        关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。其中第一个块始终是HEAD 块; 最后一个块总是一个TAIL块。关键数据块如下所示:

IHDR:图像标头

        文件头数据块IHDR(header chunk)是 PNG 数据流中的第一个块。它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块[1]。文件头数据块由13字节组成,它的格式如下表所示:

【数据压缩(二)】PNG文件格式分析_第2张图片

PLTE:与索引 PNG 图像关联的调色板表

        调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它只与索引彩色图像有关,放在图像数据块(image data chunk)之前。PLTE数据块是定义图像的调色板信息,可以包含1~256个调色板信息,每一个调色板信息由3个字节组成。因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板[1]。

【数据压缩(二)】PNG文件格式分析_第3张图片

IDAT:图像数据块

        图像数据块IDAT(image data chunk)存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放图像真正的数据信息,这些数据是压缩算法的输出流[1]。

IEND:图像结束数据块

        图像结束数据IEND(image trailer chunk) 是 PNG 数据流中的最后一个块,用来标记PNG文件或者数据流已经结束,必须要放在文件的尾部[1]。PNG文件的结尾12个字符看起来总应该是这样的:00 00 00 00 49 45 4E 44 AE 42 60 82。结合上述结构可知,IEND数据块的长度总是0(00 00 00 00),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。

2)辅助数据块

        PNG文件中其余14个块称为辅助数据块,编码器可以生成和编译这些块类型,辅助数据块如下所示:

          透明度信息:tRNS(透明信息数据块)

        色彩空间信息:cHRM(基色和白色度数据块)、gAMA(图像γ数据块)、iCCP(嵌入式ICC配置文件)、sBIT(样本有效位数据块)、sRGB(基色和白色度数据块)

        文本信息:iTXt(国际文本数据)、tEXt(基色和白色度数据块)、zTXt(压缩文本数据块)

        杂项信息:bKGD(背景颜色数据块)、hIST(图像直方图数据块)、pHYs(物理像素尺寸数据块)、sPLT(建议调色板)

        时间信息:tIME(图像最后修改时间数据块)[2]

3、数据块结构

        PNG文件中,每个数据块由4个部分组成,如下:

【数据压缩(二)】PNG文件格式分析_第4张图片

        长度字段:一个4字节的无符号整数,指示块数据字段的大小,不超过 (2^31-1)字节。长度不包括紧跟在后面的四字节块类型,也不包括四字节CRC字段。零也是有效长度。

        数据块类型码:一个4字节块类型。为了便于描述和检查PNG文件,由大写和小写ASCII字母组成,但编码器和解码器必须将其作为固定的二进制值而非字符串来处理。

        数据块:适用于该块的数据字节,存储按照数据块类型码指定的数据。此字段的长度可能为零。

        循环冗余检测:一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是不包括长度字段。每个块的CRC都是必需的,以便尽快检测传输不良的图像[2]。

以下是关于PNG文件格式的问题和思考:

1、如何理解图像透明?

        图像的透明度主要由tRNS块决定,PNG图片有4个通道,RGB通道和alpha通道,alpha通道所含的是透明信息。在tRNS块中四字节块类型字段包含十进制值:116 82 78 83。tRNS 块指定与调色板条目关联的 alpha 值(对于索引颜色图像)或单个透明颜色(对于灰度和真彩色图像)。tRNS 块包含:

【数据压缩(二)】PNG文件格式分析_第5张图片

        对于颜色类型 3,tRNS 块包含一系列单字节 alpha 值,对应于 PLTE 块中的条目。每个条目都表示相应调色板索引的像素应被视为具有指定的 alpha 值。alpha 值与 8 位全 alpha 通道中的解释相同:0 表示完全透明,255 表示完全不透明,而不考虑图像位深度。tRNS 块包含的 alpha 值不应多于组件面板条目,但 tRNS 块包含的值可能少于组件面板条目。在这种情况下,假定所有剩余调色板条目的 alpha 值为 255。在只需要将调色板索引 0 设为透明的情况下,只需要一个单字节 tRNS 块,并且当所有调色板索引都不透明时,可以省略 tRNS 块。

        对于颜色类型 0 或 2,无论图像位深度如何,每个样本都使用两个字节。指定的灰色样本值或RGB样本值的像素被视为透明;所有其他像素将被视为完全不透明。如果图像位深度小于 16,则使用最低有效位,其他位为 0[2]。

2、如何理解PNG图像格式的压缩?

        PNG图片的压缩,分两个阶段。一是预解析(Prediction):这个阶段就是对PNG图片进行一个预处理,处理后让它更方便后续的压缩。PNG图片用差分编码(Delta encoding)对图片进行预处理,处理每一个的像素点中每条通道的值。差分编码的目的,就是尽可能的将PNG图片数据值转换成一组重复的、低的值,这样的值更容易被压缩。

        二是压缩(Compression):执行Deflate压缩,该算法结合了 LZ77 算法和 Huffman 算法对图片进行编码。压缩阶段会将预处理阶段得到的结果进行Deflate压缩,它由 Huffman 编码 和 LZ77压缩构成。Deflate压缩会标记图片所有的重复数据,并记录数据特征和结构,会得到一个压缩比最大的PNG图片编码数据。Deflate是一种压缩数据流的算法. 任何需要流式压缩的地方都可以用[3]。

参考文献

[1] PNG、JPEG、BMP等几种图片格式详解(一)—— PNG - 简书

[2] https://www.w3.org/TR/PNG/#11iTXt

[3] https://cloud.tencent.com/developer/article/1423432

你可能感兴趣的:(图像处理)