目录
- PNG 的优势之一,特别是与 GIF 和 TIFF 图像格式相比,是它的压。
- 作为推论,PNG 文件大小通常比普通 JPEG 大得多,因为后者使用有损压缩。TIFF 还支持将 JPEG 压缩作为其众多选项之一,但更常见的方法是无损的,并且基于运行长度编码 (RLE) 或 GIF 中使用的相同 LZW 算法
RLE : run-length encoding
过滤
PNG 的性能不仅仅归功于改进的压缩算法。PNG 还支持称为过滤的预压缩步骤。过滤是一种可逆
变换图像数据的方法,使主压缩引擎可以更有效地运行。1-255均匀增加的字节序列,利用临近差异值替换,可以得到一个极其可压缩的集合。
PNG 五种过滤器类型
PNG 支持五种类型的过滤器,编码器可以选择为图像中的每一行像素使用不同的过滤器
PNG Filter Types
Name |
Description |
Sub |
Each byte is replaced with the difference between it and the ``corresponding byte’’ to its left. |
Up |
Each byte is replaced with the difference between it and the byte above it (in the previous row, as it was before filtering). |
Average |
Each byte is replaced with the difference between it and the average of the corresponding bytes to its left and above it, truncating any fractional part. |
Paeth |
Each byte is replaced with the difference between it and the Paeth predictor of the corresponding bytes to its left, above it, and to its upper left. |
翻译:
名称 |
描述 |
没有任何 |
每个字节不变。 |
子 |
每个字节都被替换为它与其左边的“对应字节”之间的差异。 |
向上 |
每个字节都被替换为它和它上面的字节之间的差异(在上一行中,就像过滤之前一样)。 |
平均数 |
每个字节都被替换为它与其左侧和上方相应字节的平均值之间的差异,截断任何小数部分。 |
Paeth |
每个字节都被替换为它与其左侧、上方和左上角的相应字节的Paeth 预测器之间的差异。 |
过滤的真正重点
大多数转换后的字节将聚集在零附近,从而为压缩引擎提供更小、更可预测的字节值范围来处理。
隔行扫描
出于过滤的目的,每个隔行扫描都被视为具有自己宽度和高度的单独图像。例如,在 256 × 256 隔行扫描图像中,通道将被视为尺寸为 32 × 32、32 × 32、64 × 32、64 × 64、128 × 64、128 × 128 和 256 × 128 的七个较小图像, 分别。[69] 这避免了如何在不同宽度的行之间定义相应字节的棘手问题。
合适的过滤器
没有。每一行进行增量测试压缩,保存最小的结果,然后对下一行重复,对于20行的图像相当于对整个图像进行五次过滤和压缩。对于将被传输和解码多次的图像来说,这可能是一个合理的权衡。
过滤器少用于低位深度图像
过滤器也很少用于低位深度(灰度)图像,尽管在极少数情况下将此类图像提升到 8 位然后过滤是有效的。但是,一般来说,过滤器类型 None 是最好的。
Deflate 压缩算法
- PNG 规范为所有图像类型定义了一种压缩方法,即deflate算法。
- deflate 具有非常理想的特性组合:高可靠性、良好的压缩、良好的编码速度、出色的解码速度、不可压缩数据的最小开销以及用于编码和解码的适度、明确定义的内存占用。
- 作为 LZ77 衍生的算法,deflate 基本上是基于滑动窗口的概念。滑动窗口的基本思想是想象在数据流中紧邻当前位置之前的某个宽度的窗口(因此随着当前位置的更新而滑动),可以将其用作一种字典来编码后续数据。
压缩对比
原文中有对比例子,可以去看原文。
用压缩技巧
给用户的
-
使用正确的图像格式
- JPEG 质量可以接受,请使用 JPEG,JPEG 几乎总是比 PNG 小,尤其是对于彩色图像。
- 颜色少,锐利边缘,PNG或GIF
- 二进制透明度,也可以使用 PNG 或 GIF
- 部分透明或无损 RGB,请使用 PNG 或 TIFF
- 对于动画,请使用 MNG 或 GIF
-
使用正确的像素深度
- 不要将 GIF(从实际角度来看,其深度始终为 8 位或更小)转换为 24 位 PNG;这将自动将文件大小增加三倍。
- 不要将灰度图像保存为 RGB
- 单色透明度(à la GIF)就足够了,请不要使用完整的 Alpha 通道;它将灰度图像的大小加倍,并将 RGB 的大小增加 33%。
- 如果质量可以接受,将真彩色图像量化和抖动到调色板
-
谨慎使用隔行扫描
隔行扫描是一种更快地传输图像有用部分的方法,尤其是在 Web 上,这样最终用户可以在图像完全下载之前单击热链接区域(如果她愿意的话)。但是正如我之前看到的,PNG 的二维隔行扫描方案在某些情况下会降低 15% 的压缩率,尤其是对于小图像。由于小图像无论如何都可以通过网络快速传输,因此它们通常不需要隔行扫描。
-
使用正确的工具
-
不要包含不必要的信息
图标和其他小图像要去掉版权等信息
给程序员的
看不懂就不摘内容了
- 使用正确的像素深度
- 使用正确的像素深度 II
- 如果可能,使用灰度
- 智能设置压缩和过滤选项
- 截断调色板
- 截断透明度块
- 聪明地做到透明
- 不要在小图像中包含不必要的块
- 为用户提供合理的选择
- 警告用户数据丢失
原文
Compression and Filtering
总结
下次不看