基本介紹
壓縮(compression)是為了減少數據大小以節省保存空間和傳輸的時間。為了數據的傳輸,壓縮能夠作用於單獨的數據內容或者所有的傳輸單元(包括數據頭),這取決於一些特定的因素。
內容壓縮很簡單,它就是移除多餘的空白字元,插入單個的重複字元指出一個字元串中重複的字元,以及將小型的位串用頻繁使用的字元替代。這種類型的壓縮能夠將文本檔案的大小減少50%。壓縮由使用特定公式和算法的程式來執行,它確定如何壓縮和解壓數據。
原理
利用算法將檔案有損或無損地處理,以達到保留最多檔案信息,而令檔案體積變小。壓縮檔案的基本原理是查找檔案內的重複位元組,並建立一個相同位元組的"詞典"檔案,並用一個代碼表示,比如在檔案里有幾處有一個相同的詞"中華人民共和國"用一個代碼表示並寫入"詞典"檔案,這樣就可以達到縮小檔案的目的軟體。由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解檔案壓縮,在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重複的藍色像點而言,與其一個一個定義“藍、藍、藍……”長長的一串顏色,還不如告訴電腦:“從這個位置開始存儲1117個藍色像點”來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機檔案歸根結底都是以“1”和“0”的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,檔案的體積都能夠被大大壓縮以達到“數據無損稠密”的效果。
總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛套用於動畫、聲音和圖像檔案中,典型的代表就是影碟檔案格式mpeg、音樂檔案格式mp3和圖像檔案格式jpg。但是更多情況下壓縮數據必須準確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的檔案稱為壓縮檔(archive),體積只有原來的幾分之一甚至更小。當然,壓縮檔已經是另一種檔案格式了,如果你想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有Winzip、WinRAR等。
重複壓縮
有兩種形式的重複存在於計算機數據中,zip就是對這兩種重複進行了壓縮。
第一種
一種是短語形式的重複,即三個位元組以上的重複,對於這種重複,zip用兩個數字:1.重複位置距當前壓縮位置的距離;2.重複的長度,來表示這個重複,假設這兩個數字各占一個位元組,於是數據便得到了壓縮,這很容易理解。
一個位元組有 0 - 255 共 256 種可能的取值,三個位元組有 256 * 256 * 256 共一千六百多萬種可能的情況,更長的短語取值的可能情況以指數方式增長,出現重複的機率似乎極低,實則不然,各種類型的數據都有出現重複的傾向,一篇論文中,為數不多的術語傾向於重複出現;一篇小說,人名和地名會重複出現;一張上下漸變的背景圖片,水平方向上的像素會重複出現;程式的源檔案中,語法關鍵字會重複出現,以幾十 K 為單位的非壓縮格式的數據中,傾向於大量出現短語式的重複。經過上面提到的方式進行壓縮後,短語式重複的傾向被完全破壞,所以在壓縮的結果上進行第二次短語式壓縮一般是沒有效果的。
第二種
第二種重複為單位元組的重複,一個位元組只有256種可能的取值,所以這種重複是必然的。其中,某些位元組出現次數可能較多,另一些則較少,在統計上有分布不均勻的傾向,這是容易理解的,比如一個 ASCII 文本檔案中,某些符號可能很少用到,而字母和數字則使用較多,各字母的使用頻率也是不一樣的,據說字母 e 的使用機率最高;許多圖片呈現深色調或淺色調,深色(或淺色)的像素使用較多(這裡順便提一下:png圖片格式是一種無損壓縮,其核心算法就是 zip 算法,它和 zip 格式的檔案的主要區別在於:作為一種圖片格式,它在檔案頭處存放了圖片的大小、使用的顏色數等信息);上面提到的短語式壓縮的結果也有這種傾向:重複傾向於出現在離當前壓縮位置較近的地方,重複長度傾向於比較短(20位元組以內)。這樣,就有了壓縮的可能:給 256 種位元組取值重新編碼,使出現較多的位元組使用較短的編碼,出現較少的位元組使用較長的編碼,這樣一來,變短的位元組相對於變長的位元組更多,檔案的總長度就會減少,並且,位元組使用比例越不均勻,壓縮比例就越大。
軟體和格式
常用壓縮軟體
WinMount、WinRAR、WinZip、7-Zip 、coolrar
常見壓縮格式
主要有:rar,zip,tar,cab,uue,jar,iso,z,7-zip,ace,lzh,arj,gzip,bz2等壓縮檔案。
經過壓縮軟體壓縮的檔案叫壓縮檔案,壓縮的原理是把檔案的二進制代碼壓縮,把相鄰的0,1代碼減少,比如有000000,可以把它變成6個0 的寫法60,來減少該檔案的空間。
JAR
JAR 檔案就是 Java Archive File,顧名思意,它的套用是與 Java 息息相關的,是 Java 的一種文檔格式。JAR 檔案非常類似 ZIP 檔案——準確的說,它就是 ZIP 檔案,所以叫它檔案包。JAR 檔案與 ZIP 檔案唯一的區別就是在 JAR 檔案的內容中,包含了一個 META-INF/MANIFEST.MF 檔案,這個檔案是在生成 JAR 檔案的時候自動創建的。
ZIP
ZIP應該算是最常見的壓縮檔案格式了,它不需要單獨的一個壓縮或者解壓縮軟體,因為Windows系統已經集成了對ZIP壓縮格式的支持。
RAR
雖然ZIP在壓縮檔案格式中地位很高,但相當多的下載網站都選擇了用RAR格式來壓縮他們的檔案,最根本的原因就在於RAR格式的檔案壓縮率比ZIP更高。
7Z作為壓縮格式的後起新秀,7Z有著比RAR更高的壓縮率,能夠將檔案壓縮的更加小巧。不過因為RAR格式已經高度普及,又沒有網路普及的“天時”相助,7Z想要取代RAR的地位還是相當不容易的。
CAB
CAB是微軟的一種安裝檔案壓縮格式,主要套用於軟體的安裝程式中。因為涉及到安裝程式,所以cab檔案中包含的檔案通常都不是簡單的直接壓縮,而是對檔案名稱等都進行了處理,所以雖然可以對其直接解壓縮,但解壓後得到的檔案通常都無法直接使用。
ISO
很多人都認為ISO是一種壓縮格式,這源於WinRAR添加了對ISO格式“解壓”的支持。而實際上,ISO並不是壓縮格式,它之中所包含的檔案也並沒有經過壓縮。ISO只是一種光碟的鏡像格式,完全複製並保存了光碟上的內容而已。所謂的對ISO“解壓”的過程,不過就是對ISO內檔案的提取過程。
TAR
tar為後輟的檔案能用WinZip或WinRAR打開,是因為WinZip或WinRar對.tar檔案進行了關聯,也就是指可以用相應的解壓軟體將其解壓。
.tar是linux下較為常用的壓縮檔案的格式,並不是什麼資料庫檔案。
UUE
uue是一種在遇到郵件編碼混合引起亂碼的情況下比較有用的壓縮格式,可以用WinZip或者WinRAR打開。
上面主要只介紹了常用的壓縮檔案。
檔案壓縮機制
基本介紹
如果從網際網路上下載程式和檔案,可能會遇到很多ZIP檔案。這種壓縮機制是一種很方便的發明,尤其是對網路用戶,因為它可以減小檔案中的比特和位元組總數,使檔案能夠通過較慢的網際網路連線實現更快傳輸,此外還可以減少檔案的磁碟占用空間。在下載了檔案後,計算機可使用WinZip或Stuffit這樣的程式來展開檔案,將其復原到原始大小。如果一切正常,展開的檔案與壓縮前的原始檔案將完全相同。 乍一聽好像很神秘:它是怎樣減少比特和位元組的數量並將它們原封不動地還原回去的呢?這個過程背後的基本理念其實非常簡單明了,就是下面這種通過簡單壓縮來明顯減小檔案的方法。
大多數計算機檔案類型都包含相當多的冗餘內容——它們會反覆列出一些相同的信息。檔案壓縮程式就是要消除這種冗餘現象。與反覆列出某一塊信息不同,檔案壓縮程式只列出該信息一次,然後當它在原始程式中出現時再重新引用它。
舉例
以大家熟悉的信息類型——單詞——為例子。
甘迺迪(John F. Kennedy)在1961年的就職演說中曾說過下面這段著名的話:
Ask not what your country can do for you——ask what you can do for your country.(不要問國家能為你做些什麼,而應該問自己能為國家做些什麼。)
這段話有17個單詞,包含61個字母、16個空格、1個破折號和1個句點。如果每個字母、空格或標點都占用1個記憶體單元,那么檔案的總大小為79個單元。為了減小檔案的大小,需要找出冗餘的部分。
可以發現:
如果忽略大小寫字母間的區別,這個句子幾乎有一半是冗餘的。九個單詞(ask、not、what、your、country、can、do、for、you)幾乎提供了組成整句話所需的所有東西。為了構造出另一半句子,其實只需要拿出前半段句子中的單詞,然後加上空格和標點就行了。
大多數壓縮程式使用基於自適應字典的LZ算法來縮小檔案。“LZ”指的是此算法的發明者Lempel和Ziv,“字典”指的是對數據塊進行歸類的方法。
排列字典的機制有很多種,它也可以像編號列表那樣簡單。在檢查甘迺迪這句著名講話時,可以挑出重複的單詞,並將它們放到編號索引中。然後,直接寫入編號而不是寫入整個單詞。
結論
因此,如果字典是:
ask
what
your
country
can
do
for
you
句子就應該是這樣的:
1 not 2 3 4 5 6 7 8-- 1 2 8 5 6 7 3 4
如果了解這種機制,那么只需使用該字典和編號模式即可輕鬆重新構造出原始句子。這就是在展開某個下載檔案時,計算機中的解壓縮程式所做的工作。還存在能夠自行解壓縮的壓縮檔案。若要創建這種檔案,編程人員需要在被壓縮的檔案中設定一個簡單的解壓縮程式。在下載完畢後,它可以自動重新構造出原始檔案。
但是使用這種機制究竟能夠節省多少空間呢?“1 not 2 3 4 5 6 7 8——1 2 8 5 6 7 3 4”當然短於“Ask not what your country can do for you-- ask what you can do for your country.”,但應注意的是,需要隨檔案一起保存這個字典。
在實際壓縮方案中,計算出各種檔案需求是一個相當複雜的過程。在上面的例子中,每個字元和空格都占用1個記憶體單元,整個原句要占用79個單元。壓縮後的句子(包括空格)占用了37個單元,而字典(單詞和編號)也占用了37個單元。也就是說,檔案的大小為74個單元,因此並沒有把檔案大小減少很多。
但這只是一個句子的情況!可以想像的是,如果用該壓縮程式處理完甘迺迪講話的其餘部分,這些單詞以及其他單詞重複了更多次。而且,正如下一節所言,為了得到儘可能高的組織效率,可以對字典進行重寫。
上一個的例子挑出了所有重複的單詞並將它們放在一個字典中,這是最顯而易見的字典編寫方法。但是壓縮程式卻不這樣認為:它對單詞沒有概念——它只會尋找各個模式。為了儘可能減小檔案的大小,它會仔細挑選出最優模式。
如果從這個角度處理該句子,最終會得到一個完全不同的字典。
如果壓縮程式掃描甘迺迪的這句話,它遇到的第一個冗餘部分只有幾個字母長。在ask not what your中,出現了一個重複的模式,即字母t後面跟一個空格——在not和what中。如果壓縮程式將此模式寫入字典,則每次出現“t”後面跟一個空格的情況時,它會寫入一個“1”。但是在這個短句中,此模式的出現次數不夠多,不足以將其保留為字典中的一個條目,因此程式最終會覆蓋它。
程式接下來注意到的內容是ou,在your和country中都出現了它。如果這是一篇較長的文檔,將此模式寫入字典會節省大量空間——在英語中ou是一個十分常見的字母組合。但是在壓縮程式看完整個句子後,它立即發現了一個更好的字典條目選擇:不僅ou發生了重複,而且your和country整個單詞都發生了重複,並且它們實際上是作為一個短語your country一起發生重複的。在本例中,程式會用your country條目覆蓋掉字典中的ou條目。
短語can do for也發生了重複,一次後面跟著your,另一次跟著you,因此我們又發現can do for you也是一種重複模式。這樣,我們可以用一個數字來代替15個字元(包含空格),而your country只允許用一個數字代替13個字元(包含空格),所以程式會用r country條目覆蓋your country條目,然後再寫入一個單獨的can do for you條目。程式通過這種方式繼續工作,挑出所有重複的信息,然後計算應該將哪一種模式寫入字典。基於自適應字典的LZ算法中的“自適應”部分指的就是這種重寫字典的能力。程式執行此工作的過程實際上非常複雜。
無論使用什麼方法,這種深入搜尋機制都能比僅僅挑出單詞這種方法更有效率地對檔案進行壓縮。如果使用上面提取出的模式,然後用“__”代替空格,最終將得到下面這個更大的字典:
ask__
what__
you
r__country
__can__do__for__you
而句子則較短:
“1not__2345__--__12354”
句子占用18個記憶體單元,字典占用41個單元,將檔案總大小從79個單元壓縮到了59個單元!這僅僅是壓縮句子的一種方法,而且不一定是最高效的方法。
優勢
那么這種機制到底有多好呢?檔案壓縮率取決於多種因素,包括檔案類型、檔案大小和壓縮方案。
在世界上的大多數語言中,某些字母和單詞經常以相同的模式一起出現。正是由於這種高冗餘性,而導致文本檔案的壓縮率會很高。通常大小合適的文本檔案的壓縮率可以達到50%或更高。大多數程式語言的冗餘度也很高,因為它們的命令相對較少,並且命令經常採用一種設定的模式。對於包含大量不重複信息的檔案(例如圖像或MP3檔案),則不能使用這種機制來獲得很高的壓縮率,因為它們不包含重複多次的模式。
如果檔案有大量重複模式,那么壓縮率通常會隨著檔案大小的增加而增加。從上面的例子中就可以看出這一點——如果我們摘錄的甘迺迪講話再長一些,您會發現又多次出現了我們字典中的模式,因此能夠通過每個字典條目節省更多的檔案空間。此外,對於更大的檔案,還可能出現具有更大普遍性的模式,從而能夠創建出效率更高的字典。
此外,檔案壓縮效率還取決於壓縮程式使用的具體算法。有些程式能夠在某些類型的檔案中更好地尋找到模式,因此能更有效地壓縮這些類型的檔案。其他一些壓縮程式在字典中又使用了字典,這使它們在壓縮大檔案時表現很好,但是在壓縮較小的檔案時效率不高。儘管這一類的所有壓縮程式都基於同一個基本理念,但是它們的執行方式卻各不相同。程式開發人員始終在嘗試建立更好的壓縮機制。
有損和無損
上文中討論的壓縮類型稱為無損壓縮,因為重新創建的檔案與原始檔案完全相同。所有無損壓縮都基於這樣一種理念:將檔案變為“較小”的形式以利於傳輸或存儲,並在另一方收到它後復原以便重新使用它。
有損壓縮則與此大不相同。這些程式直接去除“不必要”的信息,對檔案進行剪裁以使它變得更小。這種類型的壓縮大量套用於減小點陣圖圖像的檔案大小,因為點陣圖圖像的體積通常非常龐大。為了了解有損壓縮的工作原理,讓我們看看你的計算機如何對一張掃描的照片進行壓縮。
對於此類檔案,無損壓縮程式的壓縮率通常不高。儘管圖片的大部分看起來都是相同的——例如,整個天空都是藍色的——但是大部分像素之間都存在微小的差異。為了使圖片變得更小同時不降低其解析度,您必須更改某些像素的顏色值。如果圖片中包含大量的藍色天空,程式會挑選一種能夠用於所有像素的藍色。然後,程式重寫該檔案,所有天空像素的值都使用此信息。如果壓縮方案選擇得當,不會有任何變化,但是檔案大小會顯著減小。
當然,對於有損壓縮,在檔案壓縮將無法復原成原始檔案的樣子。壓縮程式會對對原始檔案重新解釋。因此,如果需要完全重現原來的內容(例如軟體應用程式、資料庫和總統就職演說),則不應該使用這種壓縮形式。
圖像壓縮技術
介紹
圖像壓縮技術是在傳遞圖像時壓縮信息量, 經過還原仍能看到原來的圖像的一種技術。
未經壓縮的圖形、圖像和音頻數據需要非常客觀的存儲空間, 即便使用光碟存儲技術 ,末壓縮過的視頻也常常是不實用的。在數字圖像監控系統中 ,需要處理大量的視頻數據, 因而圖像的壓縮編碼和解碼顯得十分重要。現在已有多種壓縮方法用於數字監控系統,目前比較普遍使用的有 :JPEG(對單幅圖像)、H .261(P ×64 )、MPEG(用於視頻用於視頻和音頻)。
技術分類
圖像壓縮技術可歸於不同類型。對於它們在多媒體系統中的套用, 我們可用源、熵和混合編碼來分辨它們。熵編碼是無損編碼, 而源編碼是有損壓縮 ,大部分多媒體系統使用混合技術 ,即將兩種技術混合在一起。
使用熵編碼不考慮媒體的特殊性質。數據流的壓縮被考慮成簡單的數字序列 , 數據的相關性不予考慮。熵編碼是一個無損壓縮的例子, 因為解壓縮過程完全恢復了原數據。行程編碼就是一個熵編碼的例子,常被用作檔案系統的數據壓縮。
源編碼考慮了數據的上下文的關係。源編碼的壓縮率取決於數據內容。對於有損壓縮技術, 源數據流和編碼後的數據流之間存在著單向關係, 數據流相似但不相同 ,不同的源編碼技術充分利用了特定媒體的特性。