我使用 ImageOptim 压缩了一个 png 文件。我使用 Zopfli 作为压缩方法。ImageOptim 保证它是无损压缩。确实我的 png 大小已经减小了,但是我怎样才能将它解压缩回原来的大小呢?
我读到了 Zopfli 压缩,它说它使用 deflate 算法压缩 png 文件。java - 如何在java中将压缩的png充气/解压缩回原始文件?
我使用 ImageOptim 压缩了一个 png 文件。我使用 Zopfli 作为压缩方法。ImageOptim 保证它是无损压缩。确实我的 png 大小已经减小了,但是我怎样才能将它解压缩回原来的大小呢?
我读到了 Zopfli 压缩,它说它使用 deflate 算法压缩 png 文件。java - 如何在java中将压缩的png充气/解压缩回原始文件?
Zopli 不会优化已压缩的 PNG 数据流。它适用于从头开始解压缩的图像。因此,您无法撤消该过程。如果您坚持在优化之前获得完全相同的结果,您可以再次使用原始算法解压缩为位图并编码为 PNG。
再解释一下: 让我们简单地说您需要压缩字符串“1111111111”。最大缓冲区大小为 5 个字节的第一个无损压缩函数将其输出为“5x1,5x1”(5 次 1,然后 5 次 1),然后具有 10 个字节的最大缓冲区的相同算法的第二个实现输出“10x1”看起来更好。这两个结果当然都是无损的,但大多数情况下你不能从“10x1”转到“5x1,5x1”。
为了确保压缩真的无损,您可以简单地解压缩并比较未压缩的版本。在您的情况下,将原始 PNG 和优化的 PNG 解压缩为位图并比较位图。
无需编程;
使用 ImageMagick 比较文件
无损压缩:
命令:
magick compare -metric mae anydesk00000.png anydesk00000.png diff.png`
输出:
0 (0)
的值0
显示零差异,因此没有损失。
有损压缩:
命令:
magick compare -metric mae anydesk00000.png anydesk00000.jpg diff.png
输出:
151.861 (0.00231724)
你不需要解压缩它,它应该是一个可以按原样使用的 png 文件,除非你做错了什么。图像没有改变,只有磁盘中的二进制表示。
无法转到原始文件,您可以重新压缩它,但您需要知道用于创建它的库以及用于创建它的压缩级别和其他设置(过滤器、放气策略、滑动窗口大小、 ...大多数 png 文件都是使用默认值创建的,但不是全部)。通常不需要,但如果您需要保留原始文件(例如匹配 md5 校验和),则不应使用 zopfli。
编辑:无损压缩有两种常见定义:
一般文件压缩使用第一个定义。如果您压缩一个 .jpg 文件,您可以获得完全相同的 .jpg 文件。
特定领域的无损压缩通常使用第二个定义,如果您从 JPEG 创建 PNG 文件,您将无法恢复原始 JPEG 文件(即使您知道原始文件是 JPEG 图像),但原始 JPEG 和PNG将具有完全相同的图像数据,但每个人都称PNG无损。
如果您将使用 Zopfli 来减小 PNG 文件大小的程序视为“PNG 文件压缩器”,则使用一般定义它不会是无损的,但它将使用特定于域的定义。如果程序声称无损压缩图像而不是文件,则没有歧义,这是第二个定义。如果该程序声称是无损优化器,那么它也是第二个定义,没有歧义。