pko*_*out 164 compression png
PNG 文件据说使用无损压缩。但是,每当我在图像编辑器中,例如GIMP并尝试将图像保存为 PNG 文件时,它会询问压缩参数,范围在 0 到 9 之间。如果它有影响视觉精度的压缩参数压缩的图像,它如何使PNG无损?
只有当我将压缩参数设置为 9 时,我才能获得无损行为吗?
llo*_*gan 216
压缩级别是文件大小和编码/解码速度之间的权衡。概括地说,即使是非图像格式,如 FLAC,也有类似的概念。
尽管文件大小不同,但由于压缩级别不同,实际解码输出将相同。
您可以使用MD5 muxer比较解码输出的MD5哈希值。ffmpeg
最好通过一些示例来说明这一点:
$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
Run Code Online (Sandbox Code Playgroud)
ffmpeg
将-compression_level 100
用于 PNG 输出。$ du -h *.png
228K 0.png
4.0K 100.png
Run Code Online (Sandbox Code Playgroud)
$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83
$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83
Run Code Online (Sandbox Code Playgroud)
由于两个哈希值相同,因此您可以确保解码后的输出(未压缩的原始视频)完全相同。
jjl*_*lin 186
PNG 是无损的。在这种情况下,GIMP 很可能只是没有使用最好的词。将其视为“压缩质量”,或者换句话说,“压缩级别”。使用较低的压缩率,您将获得更大的文件,但生成所需的时间更少,而使用更高的压缩率,您将获得更小的文件,生成所需的时间更长。通常,当达到最高压缩级别时,您会得到收益递减(即,与所需时间的增加相比,大小的减少没有那么多),但这取决于您。
小智 24
PNG 压缩分两个阶段进行。
由于第 2 步是一项时间/资源密集型任务,底层 zlib 库(原始 DEFLATE 的封装)采用的压缩参数范围为 1 = 最快压缩,9 = 最佳压缩,0 = 无压缩。这就是 0-9 范围的来源,GIMP 只是将该参数传递给 zlib。请注意,在级别 0 时,您的 png 实际上会比等效位图略大。
然而,级别 9 只是 zlib 将尝试的“最佳”,并且仍然是一个非常折衷的解决方案。
要真正体会到这一点,如果您愿意在详尽搜索上花费 1000 倍以上的处理能力,则可以使用zopfli而不是 zlib 将数据密度提高 3-8% 。
压缩仍然是无损的,它只是数据的更优化 DEFLATE 表示。这接近了与 zlib 兼容的库的限制,因此是使用 PNG 可以实现的真正“最佳”压缩。
har*_*ymc 16
PNG 格式的主要动机是创建 GIF 的替代品,它不仅是免费的,而且基本上在所有方面都对其进行了改进。因此,PNG 压缩是完全无损的——也就是说,原始图像数据可以精确地、逐位重建——就像在 GIF 和大多数形式的 TIFF 中一样。
PNG 使用 2 阶段压缩过程:
预压缩步骤称为过滤,它是一种对图像数据进行可逆变换的方法,以便主压缩引擎可以更有效地运行。
作为一个简单的例子,考虑一个从 1 到 255 均匀增加的字节序列:
1, 2, 3, 4, 5, .... 255
Run Code Online (Sandbox Code Playgroud)
由于序列中没有重复,它压缩得非常差或根本没有压缩。但是对序列进行微不足道的修改——即,单独保留第一个字节,但用它与其前任之间的差异替换每个后续字节——将序列转换为一个极其可压缩的集合:
1, 1, 1, 1, 1, .... 1
Run Code Online (Sandbox Code Playgroud)
上述转换是无损的,因为没有遗漏任何字节,并且是完全可逆的。这个系列的压缩尺寸会大大减少,但仍然可以完美地重组原始系列。
实际的图像数据很少如此完美,但过滤确实可以改善灰度和真彩色图像的压缩,并且它也可以帮助处理某些调色板图像。PNG 支持五种类型的过滤器,编码器可以选择对图像中的每一行像素使用不同的过滤器:
该算法适用于字节,但对于大像素(例如,24 位 RGB 或 64 位 RGBA)仅比较相应的字节,这意味着像素颜色的红色分量与绿色和蓝色像素分量分开处理。
要为每一行选择最佳过滤器,编码器需要测试所有可能的组合。这显然是不可能的,因为即使是 20 行的图像也需要测试超过 95 万亿个组合,其中“测试”将涉及过滤和压缩整个图像。
压缩级别通常定义为 0(无)和 9(最佳)之间的数字。这些指的是速度和大小之间的权衡,并与要尝试的行过滤器组合的数量有关。关于这些压缩级别没有标准,因此每个图像编辑器都可能有自己的算法,以确定在优化图像大小时要尝试多少过滤器。
压缩级别 0 意味着根本不使用过滤器,这很快但很浪费。更高的级别意味着在图像行上尝试越来越多的组合,并且只保留最好的组合。
我猜想最佳压缩的最简单方法是使用每个过滤器对每一行进行增量测试压缩,保存最小的结果,然后对下一行重复。这相当于对整个图像进行五次过滤和压缩,对于将被传输和解码多次的图像来说,这可能是一个合理的权衡。根据工具开发人员的判断,较低的压缩值会产生较少的影响。
除了过滤器之外,压缩级别也可能会影响 zlib 压缩级别,它是一个介于 0(不放气)和 9(最大放气量)之间的数字。指定的 0-9 级别如何影响过滤器的使用,过滤器是 PNG 的主要优化功能,仍然取决于该工具的开发人员。
结论是 PNG 有一个压缩参数,可以非常显着地减小文件大小,而且不会丢失一个像素。
资料来源:
维基百科便携式网络图形
libpng 文档第 9 章 - 压缩和过滤
小智 5
好的,我获得赏金为时已晚,但无论如何这就是我的答案。
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 文件的大小,但在较大的图像上可能需要相当多的时间。请参阅Source Forge-pngcrush。
归档时间: |
|
查看次数: |
38289 次 |
最近记录: |