2010-09-26 105 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位的大小。

但是壓縮算法最終會在壓縮文件中添加更多的數據,以便以後能夠解壓縮它們。算法包括一些關於壓縮數據時「縮寫」的信息。這意味着熵的理論極限不會因爲額外的算法專用數據而達到。

如果您的文件已被壓縮,這意味着它的大小已經接近原始數據的熵。當你嘗試再次壓縮它(特別是在你的情況下,因爲你使用相同的算法),尺寸減小將不會太多,並且您將會添加另一層算法特定的額外數據。如果額外的數據超過了額外的尺寸縮減,則您的兩次壓縮文件將比僅壓縮一次的文件大。