【问题标题】:zlib compression greater than maximum compressionzlib 压缩大于最大压缩
【发布时间】:2015-05-02 13:12:56
【问题描述】:

大家好,我需要有关使用 zlib 压缩级别的帮助。我正在尝试为对文件进行 zlib 压缩的游戏编写应用程序。

我能够毫无问题地解压缩文件,但我无法将文件重新压缩到相同级别。重新压缩的文件总是稍大一些。我需要压缩文件的大小相同或更小,因为游戏不会读取更大的文件。

我的应用程序是用 C# 编码的。我曾尝试使用 zlib.net 和 system.io.compression 命名空间,但即使指定了最大压缩率,两者都无法充分压缩文件。

对于 System.IO.Compression 命名空间,我指定的是 CompressionLevel.Optimal。

对于 zlib.net,我指定 zlib.zlibConst.Z_BEST_COMPRESSION 。

我附上了下面的文件,我已经包含了原始文件以及使用 zlib.net 和 system.io.compression 压缩的文件。

感谢您提供的任何帮助:

在此处下载文件:http://www13.zippyshare.com/v/j7EsgTDo/file.html

【问题讨论】:

  • 不同的实现会产生不同的结果。这是意料之中的。

标签: c# compression max zlib


【解决方案1】:

我能够通过使用命令行工具 gzip -9 压缩解压缩的数据来精确复制您的 000C_original_file.zlib,然后通过剥离 gzip 标头和尾部并使用 zlib 标头重新包装压缩数据并重新包装预告片。几乎可以肯定,原作就是这样制作的。

正如@usr 所建议的,您可以使用 Zopfli 来重新压缩以获得更小的东西。我使用 pigz -11z 使用 Zopfli(压缩级别 11)压缩到 zlib 格式,结果小于原始的 3863127 字节,而原始的为 3942494。

【讨论】:

  • 事实上,ftp.simplesystems.org/pub/png/images/png 的大多数图像都是在 1995 年初制作的。它们早于 zlib 和 libpng。不幸的是,由于许可兼容性问题,我不得不销毁我的 PNG 编写软件(gzip 是 GPL,而我作为联邦雇员的工作必然是公共领域)。幸运的是,libpng 和 zlib 于 1995 年 5 月推出,所以我重新开始使用它们。
【解决方案2】:

网络上有一些工具可用于缩小 ZIP 文件(和压缩流)。例如有“Zopfli”。如果您需要从 Deflate 流中挤出最后一个字节,请使用这些工具之一对其进行后处理。您需要使用Process.Start 来启动压缩工具。

【讨论】:

    【解决方案3】:

    值得注意的是,7Zip 应用程序中的 ZIP/Deflate 压缩支持通常优于 Deflate 的旧实现,同时保持与它们的兼容性(仍然可以与旧版本解压缩。并非所有 Deflate 实现都是相同的。

    另请注意,System.IO.Compression.GZipStream 和 DeflateStream 类在没有任何头数据的情况下实现 Deflate(纯 deflate 算法,不支持任何存档格式)。

    【讨论】:

    • Zopfli 压缩到 deflate 格式的效果甚至比 7Zip/liblzma 还要好,尽管速度较慢。