資源描述:
《提取網(wǎng)頁圖片鏈接地址代碼》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、原計劃中使用過的LZW圖片壓縮算法:LZW壓縮算法是一種新穎的壓縮方法,由Lemple-Ziv-Welch三人共同創(chuàng)造,用他們的名字命名。它采用了一種先進(jìn)的串表壓縮不,將每個第一次出現(xiàn)的串放在一個串表中,用一個數(shù)字來表示串,壓縮文件只存貯數(shù)字,則不存貯串,從而使圖象文件的壓縮效率得到較大的提高。奇妙的是,不管是在壓縮還是在解壓縮的過程中都能正確的建立這個串表,壓縮或解壓縮完成后,這個串表又被丟棄。1.基本原理首先建立一個字符串表,把每一個第一次出現(xiàn)的字符串放入串表中,并用一個數(shù)字來表示,這個數(shù)字與此字符串在串表中的位置有關(guān),并將這個數(shù)字存入壓縮文件中,如果這個字符串再
2、次出現(xiàn)時,即可用表示它的數(shù)字來代替,并將這個數(shù)字存入文件中。壓縮完成后將串表丟棄。如"print"字符串,如果在壓縮時用266表示,只要再次出現(xiàn),均用266表示,并將"print"字符串存入串表中,在圖象解碼時遇到數(shù)字266,即可從串表中查出266所代表的字符串"print",在解壓縮時,串表可以根據(jù)壓縮數(shù)據(jù)重新生成。2.實現(xiàn)方法A.初始化串表在壓縮圖象信息時,首先要建立一個字符串表,用以記錄每個第一次出現(xiàn)的字符串。一個字符串表最少由兩個字符數(shù)組構(gòu)成,一個稱為當(dāng)前數(shù)組,一個稱為前綴數(shù)組,因為在GIF文件中每個基本字符串的長度通常為2(但它表示的實際字符串長度可達(dá)幾百甚
3、至上千),一個基本字符串由當(dāng)前字符和它前面的字符(也稱前綴)構(gòu)成。前綴數(shù)組中存入字符串中的首字符,當(dāng)前數(shù)組存放字符串中的尾字符,其存入位置相同,因此只要確定一個下標(biāo),就可確定它所存貯的基本字符串,所以在數(shù)據(jù)壓縮時,用下標(biāo)代替基本字符串。一般串表大小為4096個字節(jié)(即2的12次方),這意味著一個串表中最多能存貯4096個基本字符串,在初始化時根據(jù)圖象中色彩數(shù)目多少,將串表中起始位置的字節(jié)均賦以數(shù)字,通常當(dāng)前數(shù)組中的內(nèi)容為該元素的序號(即下標(biāo)),如第一個元素為0,第二個元素為1,第15個元素為14,直到下標(biāo)為色彩數(shù)目加2的元素為止。如果色彩數(shù)為256,則要初始化到第25
4、8個字節(jié),該字節(jié)中的數(shù)值為257。其中數(shù)字256表示清除碼,數(shù)字257為圖象結(jié)束碼。后面的字節(jié)存放文件中每一個第一次出現(xiàn)的串。同樣也要音樂會前綴數(shù)組初始化,其中各元素的值為任意數(shù),但一般均將其各位置1,即將開始位置的各元素初始化為0XFF,初始化的元素數(shù)目與當(dāng)前數(shù)組相同,其后的元素則要存入每一個第一次出現(xiàn)的字符串了。如果加大串表的長度可進(jìn)一步提高壓縮效率,但會降低解碼速度。B.壓縮方法了解壓縮方法時,先要了解幾個名詞,一是字符流,二是代碼流,三是當(dāng)前碼,四是當(dāng)前前綴。字符流是源圖象文件中未經(jīng)壓縮的圖象數(shù)據(jù);代碼流是壓縮后寫入GIF文件的壓縮圖象數(shù)據(jù);當(dāng)前碼是從字符流中
5、剛剛讀入的字符;當(dāng)前前綴是剛讀入字符前面的字符。GIF文件在壓縮時,不論圖象色彩位數(shù)是多少,均要將顏色值按字節(jié)的單位放入代碼流中,每個字節(jié)均表示一種顏色。雖然在源圖象文件中用一個字節(jié)表示16色、4色、2色時會出現(xiàn)4位或更多位的浪費(因為用一個字節(jié)中的4位就可以表示16色),但用LZW壓縮法時可回收字節(jié)中的空閑位。在壓縮時,先從字符流中讀取第一個字符作為當(dāng)前前綴,再取第二個字符作為當(dāng)前碼,當(dāng)前前綴與當(dāng)前碼構(gòu)成第一個基本字符串(如當(dāng)前前綴為A,當(dāng)前碼為B則此字符串即為AB),查串表,此時肯定不會找到同樣字符串,則將此字符串寫入串表,當(dāng)前前綴寫入前綴數(shù)組,當(dāng)前碼寫入當(dāng)前數(shù)組
6、,并將當(dāng)前前綴送入代碼流,當(dāng)前碼放入當(dāng)前前綴,接著讀取下一個字符,該字符即為當(dāng)前碼了,此時又形成了一個新的基本字符串(若當(dāng)前碼為C,則此基本字符串為BC),查串表,若有此串,則丟棄當(dāng)前前綴中的值,用該串在串表中的位置代碼(即下標(biāo))作為當(dāng)前前綴,再讀取下一個字符作為當(dāng)前碼,形成新的基本字符串,直到整幅圖象壓縮完成。由此可看出,在壓縮時,前綴數(shù)組中的值就是代碼流中的字符,大于色彩數(shù)目的代碼肯定表示一個字符串,而小于或等于色彩數(shù)目的代碼即為色彩本身。C.清除碼事實上壓縮一幅圖象時,常常要對串表進(jìn)行多次初始化,往往一幅圖象中出現(xiàn)的第一次出現(xiàn)的基本字符串個數(shù)會超過4096個,在
7、壓縮過程中只要字符串的長度超過了4096,就要將當(dāng)前前綴和當(dāng)前碼輸入代碼流,并向代碼流中加入一個清除碼,初始化串表,繼續(xù)按上述方法進(jìn)行壓縮。D.結(jié)束碼當(dāng)所有壓縮完成后,就向代碼流中輸出一個圖象結(jié)束碼,其值為色彩數(shù)加1,在256色文件中,結(jié)束碼為257。E.字節(jié)空間回收在GIF文件輸出的代碼流中的數(shù)據(jù),除了以數(shù)據(jù)包的形式存放之外,所有的代碼均按單位存貯,樣就有效的節(jié)省了存貯空間。這如同4位彩色(16色)的圖象,按字節(jié)存放時,只能利用其中的4位,另外的4位就浪費了,可按位存貯時,每個字節(jié)就可以存放兩個顏色代碼了。事實上在GIF文件中,使用了一種可變數(shù)的存