PNG 有压缩参数,如何才能做到无损?

PNG 有压缩参数,如何才能做到无损?

PNG 文件据说使用无损压缩。然而,每当我在图像编辑器中时,例如GIMP并尝试将图像保存为 PNG 文件,它会要求输入压缩参数,范围在 0 到 9 之间。如果它有一个影响压缩图像视觉精度的压缩参数,那么它如何使 PNG 无损?

仅当我将压缩参数设置为 9 时才会获得无损行为吗?

答案1

PNG 是无损的。GIMP 很可能只是没有用对这个词。可以将其视为“压缩质量”,或者换句话说,“压缩级别”。压缩率越低,文件越大,但生成时间越短;压缩率越高,文件越小,生成时间越长。通常,压缩率越高,文件越小,生成时间越长。通常,压缩率越高,文件越小(即,与生成时间增加相比,文件大小减少得越少),但这取决于您。

答案2

PNG 经过压缩,但无损

压缩级别是文件大小和编码/解码速度之间的权衡。概括地说,即使是非图像格式,例如 FLAC,也有类似的概念。

不同的压缩级别,相同的解码输出

虽然文件大小不同,但由于压缩级别不同,实际解码的输出将是相同的。

您可以比较MD5ffmpeg使用解码输出的哈希值MD5 复用器

最好通过一些例子来证明这一点:

创建 PNG 文件:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • 默认情况下ffmpeg将用于-compression_level 100PNG 输出。

比较文件大小:

$ du -h *.png
  228K    0.png
  4.0K    100.png

解码 PNG 文件并显示 MD5 哈希值:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

由于两个哈希值相同,因此您可以确保解码的输出(未压缩的原始视频)完全相同。

答案3

PNG 压缩分为两个阶段。

  1. 预压缩重新排列图像数据,以便通过通用压缩算法进行压缩。
  2. 实际的压缩由 DEFLATE 完成,它搜索重复的字节序列并用短标记替换它们来消除它们。

由于步骤 2 是一项非常耗时/耗资源的任务,底层 zlib 库(原始 DEFLATE 的封装)采用压缩参数,范围从 1 = 最快压缩、9 = 最佳压缩、0 = 无压缩。这就是 0-9 范围的来源,而 GIMP 只是将该参数传递给 zlib。请注意,在级别 0 时,您的 png 实际上会比等效位图略大。

然而,级别 9 只是 zlib 尝试的“最佳”级别,并且仍然非常折衷方案
要真正体会这一点,如果你愿意在详尽搜索上花费 1000 倍以上的处理能力,你可以使用以下方法获得 3-8% 更高的数据密度佐普夫利而不是 zlib。
压缩仍然是无损的,只是数据的更优化的 DEFLATE 表示。这接近 zlib 兼容库的极限,因此是使用 PNG 可以实现的真正“最佳”压缩。

答案4

好的,我获得赏金已经太晚了,但是无论如何这是我的答案。

PNG 始终无损。它使用 Deflate/Inflate 算法,类似于 zip 程序中使用的算法。

Deflate 算法搜索重复的字节序列并用标签替换它们。压缩级别设置指定程序使用多少精力来找到最佳的字节序列组合,以及为此保留多少内存。它是时间和内存使用量与压缩文件大小之间的折衷。但是,现代计算机速度如此之快,内存也足够,因此除了最高压缩设置外,很少需要使用其他设置。

许多 PNG 实现都使用 zlib 库进行压缩。Zlib 有九个压缩级别,1-9。我不知道 Gimp 的内部原理,但由于它的压缩级别设置是 0-9(0 = 无压缩),我认为此设置只是选择 zlib 的压缩级别。

Deflate 算法是一种通用压缩算法,它不是为压缩图片而设计的。与大多数其他无损图像文件格式不同,PNG 格式不限于此。PNG 压缩利用了我们在压缩一个2D 图像。这是通过所谓的过滤器

(这里的过滤器实际上是一个有点误导性的术语。它实际上并没有改变图像内容,只是对其进行了不同的编码。更准确的名称应该是增量编码器。)

PNG 规范指定了 5 种不同的过滤器(包括 0 = 无)。过滤器用以下方式替换绝对像素值:与前一个像素的差异向左、向上、对角线或这些的组合。这可以显著提高压缩率。图像上的每条扫描线可以使用不同的过滤器。编码器可以通过为每条线选择最佳过滤器来优化压缩。

有关 PNG 文件格式的详细信息,请参阅PNG 规范

由于组合数量几乎是无限的,因此不可能全部尝试。因此,已经开发出不同类型的策略来寻找有效的组合。大多数图像编辑器可能甚至不会尝试逐行优化过滤器,而是只使用固定过滤器(最有可能是 Paeth)。

命令行程序pngcrush尝试多种策略来找到最佳结果。它可以显著减少其他程序创建的 PNG 文件的大小,但对于较大的图像可能需要相当长的时间。请参阅源锻造 - pngcrush

相关内容