夜下客

繁体版 简体版
夜下客 > JS修炼法则 > 第17章 深入PNG格式

第17章 深入PNG格式

分组成: 内容长度(4Byte)、类型(4Byte)、chunk数据、循环冗余校验。

4-1.IHDR

PNG文件的第一个chunk,有且只能有一个的header chunk。

存储图像数据的基本信息, 类型标识为73 72 68 82(十进制)。

Height: 图片像素高度(4byte) Width: 图片像素宽度(4byte) Compression method:压缩算法(1byte) Filter method:滤波器方法(1byte) Interlace method:隔行扫描方法(1byte) ,0为非隔行扫描,隔行扫描可以逐步加载显示图片。Interlacing and progressive display Bit depth: 颜色类型(1byte) 索引彩色图像,灰度图像,真彩色图像 ColorType:颜色类型(1byte)

4-2.IDAT

图片的数据,类型标识为73 68 65 84(十进制)。IDAT块如果有多个,必须是连续的,不能穿插其他chunk。

4-3.IEND

标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。类型标识为4945 4e44(十六进制),73 69 78 68(十进制),length总是为0;对应的CRC为ae42 6082 (十六进制)

5.压缩

PNG压缩分为,两个阶段:预解析、Deflate压缩。

5-1.预解析

该阶段使用差分编码(Delta encoding), 处理每一个的像素点中每条通道的值。

假设该渐变色图的色值为[1,2,3,4,5,6,7,8], 使用差分编码 进行计算[2-1=1,3-2=1,4-3=1,5-4=1,6-5=1,7-6=1,8-7=1], 即得到结果[1,1,1,1,1,1,1],这种重复的数字非常适合压缩。

这也是为什么单一颜色图片、单一 渐变色图片容易被压缩的原因。

差分编码是尽可能的将png图片数据值转换成一组重复的值,易被压缩。

差分编码处理的是每一个的像素点中每条颜色通道的值,R(红)、G(绿)、B(蓝)、A(透明)四个颜色通道的值分别进行处理。

5-2.压缩

压缩阶段会将预处理阶段得到的结果进行Deflate压缩,它由 Huffman 编码 和 LZ77压缩构成。

Deflate压缩会标记图片所有的重复数据,并记录数据特征和结构,会得到一个压缩比最大的png图片 编码数据。

Deflate是一种压缩数据流的算法。 任何需要流式压缩的地方都可以用。

PNG的数据块中,很多对于成像无意义的块,比如记录创建源、创建备注等无用信息块,都可以在压缩阶段剔除。

6.结尾

PNG采用了索引彩色模式和无损压缩, 非常yyds。

JPG(或称JPEG),其压缩过程中的色彩空间转换步骤时,量化图像颜色时采用的是YCbCr模式, 将亮度和颜色分开处理(对亮度几乎无处理,压缩颜色)。再接着经过缩减取样、离散余弦变换(DCT)、量化、熵编码,最终就得到压缩后得到图片了。

Y表示亮度, Cb表示彩度(蓝),Cr表示彩度(红)。

『加入书签,方便阅读』