第五章 数据流的结构
5.1介绍
这部分定义了PNG的签名和数据块的基本属性。数据块类型在第十一章中单独讨论。
5.2PNG签名
一个PNG数据流的前八个字节总是如下的十进制的数据:
137 80 78 71 13 10 26 10
这个签名显示了这个数据流的剩余部分包括了一个单独的PNG图像。
包括了一系列的数据块,以图像头数据块开始和以图像尾数据块结束。
5.3数据块布局
每一个数据块由三个或者是四个域组成,域的含义在表格5.1中描述。
数据块的数据部分可能是空的。
数据块的第一部分是长度域,第二个部分是数据块类型域,第三个部分是数据块的数据域,
它也能为空的。最后一部分是循环检验码域。
表格5.1
长度 它是一个无符号的四个字节的整数,记录了数据块的数据域字节数量。长度仅计算数据的域。
不包括它本身的四个字节,也不包括类型和循环检验码的字节。0是有效的长度,尽管编码器
和解码器应该把长度视为是无符号的,但它的值不应该超过2的31次幂-1个字节。
数据块类型 四个字节的序列定义了数据块类型。一个数据块类型的每一个字节的值都被限制在
65-90和97-122之间。这对应着ISO646字母的大小写。为了描述与检查的一致性。
编码器和解码器应该把数据块类型视为固定长度的二进制的值,而不是字符串。例如,
使用UCS2字符集的等效的字符来表示数据块类型IDAT是不对的。对于数据块类型的附加
的命名规范在5.4部分中描述。
数据块数据 这些数据字节是这个数据块的主体,如果有可能的话,这个域能够是0个字节。
循环检验码 一个四字节长的CRC的计算是包括了数据块类型和数据块数据的域,但不包括
长度域。CRC能被用来检查数据的损坏。CRC总是存在的,即使块中没有数据域。
数据块的数据长度可能是小于最大值的任何一个值,因为实现器不能假定被分配了界定符。
5.4数据块的命名规范
当数据块的类型被解释为ISO646的字母时,数据块类型选择了有意义的名称。
赋予数据块类型是为了解码器在类型无法被识别时也能确定数据块的一些属性。
在解码器遇到了未知的数据块时,通过允许解码器来决定做什么,这些规则
允许PNG格式的安全的灵活的扩展。(在这个国际标准中标准化的数据块类
型在第十一章中被定义,并且添加非标准化的数据块的方式在第十四章中被定义)
命名的规则仅对当解码器不能识别数据块类型时的情况感兴趣。
数据块类型的4个比特,属性的比特,也就是每个字节的第五个比特(值32)被用来
表达数据块的属性。这个选择意味着一个人能读懂赋予的属性,根据数据块类型的每一个
字节是大写(第五位比特是0)还是小写(第五位比特是1)。然而,解码器应该测试一个
未知的数据块类型的属性通过数据化地测试特定的比特位;测试一个字符是大写还是小写
是低效的,并且如果一个本地化的特定的大小写定义被使用的话,甚至是错误的。
属性位是一个数据块类型的固有的部分,并且因此对于任何一个数据块类型是固定的。
因此,CHNK和cHNK是不相关的数据块类型,而不是同一个数据块带着不同的属性。
属性位的语义在表格5.2中被定义
附加的位: 0(大写)=关键性的,
第一个字节中 1(小写)=附加的
私有的位: 0(大写)=公开的,
第二个字节中 1(小写)=私有的
保留的位: 0(大写)=本版本的,
第三个字节中 1(小写)=非本版本
安全复制的位 0(大写)=非安全复制的,
第四个字节中 1(小写)=安全复制的
例如,假设数据块的类型是“cHNk”有如下的属性位:
cHNk
||||
|||+- 安全复制位 是1
||+-- 保留位是0
|+--- 私有位是0
+----- 附加位是1
因此,这个名称表示它是一个附加的,公开的,安全复制的数据块。
5.5循环冗余校验编码的算法
使用带有前置和后置条件的标准化的CRC方法来计算CRC域,正如在ISO3309和ITU-T-V42中的定义。CRC
的计算的多项式如下:
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+1
在PNG中,32位的CRC被初始化为都是1,然后从每个字节中来的数据被处理从最低位(1)到最高位(128)。
所有的数据字节被处理后,CRC生成了。这个值被存储在数据流中,被传输是大端的。为了分离成字节和顺序的目的
32位的CRC的最低位被定义为x^31的系数。
CRC的实际计算通常引入一个预计算的表格,来加速计算的过程。见附录D,CRC实现的例子代码。
5.6数据块的顺序
单独的数据块的位置约束被列在了表格5.3中,图示在图5.2和图5.3中。
这些表与图显示了在这个国际标准中对数据块的位置上的约束。图中的线
定义了部分的顺序关系。数据块在上方的应该比在下方的先出现。在同一层的,
可以不计前后关系。与数据块类型相关的超级脚本被定义在表格5.4中。它显示了
数据块是否是必需要的,可选的,或者是可能出现多次的。在两个数据块类型之
间的框,说明它们是选其一的。
表格5.3
——————————————————————
数据块名称 是否允许多个 顺序的约束
IHDR 不 应该是第一个
PLTE 不 在第一个IDAT之前
IDAT 是 多个IDAT应该是连续的
IEND 不 应该是最后一个
cHRM 不 在PLTE和IDAT之前
gAMA 不 在PLTE和IDAT之前
iCCP 不 在PLTE和IDAT之前 如果它存在,sRGB不应该存在
sBIT 不 在PLTE和IDAT之前
sRGB 不 在PLTE和IDAT之前 如果它存在,iCCP不应该存在。
bKGD 不 在PLTE之后和IDAT之前
hIST 不 在PLTE之后和IDAT之前
tRNS 不 在PLTE之后和IDAT之前
pHYs 不 在IDAT之前
sPLT 是 在IDAT之前
tIME 不 无约束
iTXt 是 无约束
tEXt 是 无约束
zTXt 是 无约束
——————————————————————
表格5.4 在图中的符号的含义
————————
符号 含义
+ 一个或多个
1 仅一个
? 0或者1个
* 0或者多个
| 二选一
————————
图5.2
图5.3