zlib 压缩大于最大压缩

zlib compression greater than maximum compression

大家好,我需要有关使用 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

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

通过使用命令行工具 gzip -9 压缩解压缩的数据,然后通过剥离 gzip 头和尾并重新包装压缩数据,我能够准确地复制您的 000C_original_file.zlib它带有 zlib 头和尾。几乎可以肯定这就是原作的制作方式。

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

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

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