第七章 把一个PNG图像编码成一个PNG的数据流
7.1 整数与字节序
所有的长度超过一个字节的整数都应该使用网络字节序(见图7.1所示)
最重要的字节(也就是最高位)首先传输,然后是按重要性的降序进行传输
(对于两个字节的整数是高位字节和低位字节,对于四个字节的整数是最高
位字节,b2,b1,最低位字节)。一个字节中的最高位是第7位,它值是128,
最低位是第0位,它的值是1。如果没有注明,值是无符号的。值被显式的注明
为有符号的,被表示为两种补记标识。
PNG的四个字节的无符号的整数的限制范围在0到2的31次幂-1.是为了容纳语言
对无符号四字节数的处理难度。相似的,PNG的四个字节的有符号整数被限制在
负的2的31次幂-1到正的2的31次幂-1之间,是为了容纳语言对负的2的31次幂
处理难度。
图7.1 整数的表示方法
7.2 扫描行
一个PNG图像是一个矩形的像素的数组,每行的像素是从左到右的,扫描行是从上到下的。每个像素的大小
是由每个像素的位的数量决定的。
一个扫描行的像素总是被打包成字节的序列,像素之间没有多余的比特位。扫描行总是开始于字节边界。
允许的位深和颜色类型被限制是为了在所有的情况下,打包是简单和高效的。
在PNG的图像中,颜色的类型为0(灰色)每个像素只有一个单独的采样,它可能有小于一个字节的精度
(1,2,4位)。这些采样被打包成字节,最左的采样在一个字节的高位,其它的采样紧随其后。
在PNG的图像中,颜色的类型为3(索引颜色)每个像素只有一个调色板的索引。这预示着索引被打包成
字节的方式,与颜色类型为0的方式是相同的。
当一个字节有多个像素时,一个扫描行的最后一个字节的一些低位可能没有使用。这些没有使用的位的内容
没有指定。
PNG图像的非索引颜色的图像可能有采样值有16位的位深度。这样的采样值以网络字节序存储和传输。
PNG允许多采样的像素仅有8位或者是16位的采样深度,所以一个像素的多个采样根本不会被打包到
一个字节中。
7.3 过滤
PNG允许扫描行的数据在它被压缩之前进行过滤。过滤能够提供数据的压缩率。
过滤步骤的本身让字节的结果序列与输入的序列有相同的大小,但是在一个不
同的表示,取决于执行的过滤类型。过滤没有把实际的扫描行的数据的大小减少。
所有的过滤是严格的无损的。
不同的过滤类型能被用于不同的扫描行,对于每个扫描行的过滤算法由过滤类型
的字节来指定。过滤类型的字节不被认为是图像数据的一部分,但是它被包括在
数据流中,发送给了压缩的步骤。一个智能的编码器能够从一个扫描行到下一个
扫描行进行过滤器的转换。选择应用哪一个过滤器的方法留给了编码器来做。