2010-09-26 102 views
3

当我GZIP一个SWF文件,大小从1,21 MB到1,86 MB ...所以,我的问题有点自己回答。真正的问题是如何这是可能的?正如我的一位同事所说,我猜想瑞士法郎已经是二元的,不能再被压缩了。压缩swf文件是否有可能导致文件变大?

结论还是压缩swf文件不应该完成。

回答

5

SWF已被编码,并且该编码包含压缩。如果您打算压缩已经压缩的文件,压缩会导致更大的文件,这是完全可能的。它发生在当您尝试ZIP a JPEGPNG文件,例如。

虽然你的同事说的不是真的。有很多可以压缩的二进制文件。例如,BMP文件。

5

查看SWF文件的前三个魔术字节。如果它们是FWS,它是一个未压缩的文件,如果它们是CWS,它已经使用zLib进行了压缩,并且无法使用gZip进一步压缩(它也使用zLib进行压缩)。虽然它应该只有一点点大,但增长50%的尺寸是极端的...

通常,未压缩的SWF文件可以压缩一点,但不是那么多。 SWF文件格式非常优化,通常会生成非常小而紧凑的文件。顺便说一下,如果您使用我的工具Precomp和压缩比gZip更好的工具(例如7-Zip),您还可以通过首先在文件上运行Precomp来进一步压缩大部分压缩的SWF文件,然后在生成的PCF文件上使用7-Zip。

这也将检测并重新压缩SWF文件内的JPG文件。这也是一个完全无损的过程,也适用于ZIP,JPG,PNG,GIF等其他已经压缩的文件类型。

1

在信息论中有一个叫做entropy的概念,它是衡量消息中“真实”信息量的一种方法(在你的例子中,消息是SWF文件)。用于这一措施的常用单位之一就是这个位。

1.21 MB的文件占用大约10,150,215位。然而,它的熵可能小于10,150,215位,因为数据中有一些顺序或可预测性。假设您测量了该文件的熵,并得出熵仅为9,000,000位的结论。这意味着你不能以无损的方式将它压缩到小于9,000,000位的大小。

但是压缩算法最终会在压缩文件中添加更多的数据,以便以后能够解压缩它们。算法包括一些关于压缩数据时“缩写”的信息。这意味着熵的理论极限不会因为额外的算法专用数据而达到。

如果您的文件已被压缩,这意味着它的大小已经接近原始数据的熵。当你尝试再次压缩它(特别是在你的情况下,因为你使用相同的算法),尺寸减小将不会太多,并且您将会添加另一层算法特定的额外数据。如果额外的数据超过了额外的尺寸缩减,则您的两次压缩文件将比仅压缩一次的文件大。