【问题标题】:How to Inflate a png compressed by zopfli如何为 zopfli 压缩的 png 充气
【发布时间】:2020-03-04 14:41:41
【问题描述】:

我使用 ImageOptim 压缩了一个 png 文件。我使用 Zopfli 作为压缩方法。 ImageOptim 保证它是无损压缩。确实我的 png 尺寸变小了,但是我怎样才能将它解压缩回原来的尺寸呢?

我读过 Zopfli 压缩,它说它使用 deflate 算法压缩 png 文件。如何在java中将压缩的png充气/解压回原始文件?

【问题讨论】:

    标签: java compression image-compression lossless-compression zopfli


    【解决方案1】:

    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)
    

    【讨论】:

    • 有趣的建议;所以我应该将压缩文件解压为位图,然后使用Zopfli算法将位图编码为png?
    • @HitherJoe 用一个简单的例子更新了答案。让我知道它是否有助于您理解为什么您真的不需要进行回滚。
    • 许多软件声称它们对 png 文件执行无损压缩。这是为了测试它们是否真的像他们声称的那样无损。由于它使用 Zopfli 很好地压缩了 png,但是将压缩的 png 文件解压缩回原始文件将证明他们的声明。我明白你的意思,我想做的是把文件膨胀回来,如果你知道怎么做,请建议。
    • @HitherJoe 当然;更新了答案。
    • Zopfli 一种压缩算法,它可以很好地将数据流压缩成 PNG、Zip、GZip 等使用的 Deflate 数据压缩格式。 Zopfli 本身是无损的(只是进行数据压缩,不知道图像等),但也许 ImageOptim 做了一些有损处理?
    【解决方案2】:

    你不需要解压缩它,它应该是一个可以按原样使用的 png 文件,除非你做错了什么。图像没有改变,只有磁盘中的二进制表示。

    无法转到原始文件,您可以重新压缩它,但您需要知道用于创建它的库以及用于创建它的压缩级别和其他设置(过滤器、放气策略、滑动窗口大小,...大多数 png 文件是使用默认值创建的,但不是全部)。通常不需要,但如果您需要保留原始文件(例如匹配 md5 校验和),则不应使用 zopfli。

    编辑:无损压缩有两种常见的定义:

    1. 能够重新创建输入文件的逐位精确副本。
    2. 无需更改即可恢复输入文件内容。输入文件的位精确再现不是目标。

    一般文件压缩使用第一个定义。如果您压缩一个 .jpg 文件,您可以获得完全相同的 .jpg 文件。

    特定领域的无损压缩通常使用第二种定义,如果您从 JPEG 创建 PNG 文件,您将无法恢复原始 JPEG 文件(即使您知道原始文件是 JPEG 图像),但是原始JPEG和PNG的图像数据完全相同,但大家都称PNG无损。

    如果您将使用 Zopfli 来减小 PNG 文件大小的程序视为“PNG 文件压缩器”,那么使用一般定义它不会是无损的,但它会使用特定于域的压缩器。如果程序声称无损压缩图像而不是文件,则没有歧义,这是第二个定义。如果程序声称是无损优化器,那么它也是第二个定义,没有歧义。

    【讨论】:

    • 谢谢,我知道压缩 png 没问题,并且在查看时没有任何区别。但它声称压缩是无损的。所以如果它真的是无损的,我应该能够将它解压缩回原来的字节,不是吗?
    • “无损”是关于“原始数据”、png 文件的图像数据(像素值)和元数据、zip 文件的未压缩文件。没有尝试恢复原始 png 或 zip 文件,它们已经使用 Deflate 算法压缩。
    • 当你用zip压缩文件时,你可以将它解压回原来的文件,这是真正的无损。因此,如果一个算法声称它可以无损压缩文件,它应该能够或者应该有一个库或一种方法将其解压缩回原始文件。这就是我想做的。既然 zopfli 声称它是无损的,我该如何解压它呢?
    • 感谢您的澄清,我现在明白您的意思了。虽然当我使用 Zopfli 压缩 png 文件并将像素数据与之前的图像进行比较时,一些像素是不同的。例如 {202,124,222,144} 和 Zopfli 压缩,虽然它声称它是无损的,但压缩后的结果是不同的 {111,232,043,225},这只是一个例子。那么,这应该意味着它是一种有损压缩,对吧?因为实际的像素数据被替换了。
    • 这意味着您做错了,例如您正在启用从 32 位 RGBA 到 8 位调色板的缩减,Zopfli 算法与此无关。我预计 Zopfli 的平均改进不会超过 5%,也不会超过 10%。
    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多