青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-4  評論-40  文章-117  trackbacks-0


這份資料的格式很不錯(cuò),收了!謝謝整理者。

  GIF文件的圖象數(shù)據(jù)使用了可變長度編碼的LZW壓縮算法(Variable-Length_Code LZW Compression),這是從LZW(Lempel Ziv Compression)壓縮算法演變過來的,通過壓縮原始數(shù)據(jù)的重復(fù)部分來達(dá)到減少文件大小的目的。

標(biāo)準(zhǔn)的LZW壓縮原理
先來解釋一下幾個(gè)基本概念:
  LZW壓縮有三個(gè)重要的對象:數(shù)據(jù)流(CharStream)、編碼流(CodeStream)和編譯表(String Table)。在編碼時(shí),數(shù)據(jù)流是輸入對象(圖象的光柵數(shù)據(jù)序列),編碼流就是輸出對象(經(jīng)過壓縮運(yùn)算的編碼數(shù)據(jù));在解碼時(shí),編碼流則是輸入對象,數(shù)據(jù)流是輸出對象;而編譯表是在編碼和解碼時(shí)都須要用借助的對象。

字符(Character):最基礎(chǔ)的數(shù)據(jù)元素,在文本文件中就是一個(gè)字節(jié),在光柵數(shù)據(jù)中就是一個(gè)像素的顏色在指定的顏色列表中的索引值
字符串(String):由幾個(gè)連續(xù)的字符組成;
前綴(Prefix):也是一個(gè)字符串,不過通常用在另一個(gè)字符的前面,而且它的長度可以為0;
(Root):單個(gè)長度的字符串;
編碼(Code):一個(gè)數(shù)字,按照固定長度(編碼長度)從編碼流中取出,編譯表的映射值;
圖案:一個(gè)字符串,按不定長度從數(shù)據(jù)流中讀出,映射到編譯表?xiàng)l目.

  LZW壓縮的原理:提取原始圖象數(shù)據(jù)中的不同圖案,基于這些圖案創(chuàng)建一個(gè)編譯表,然后用編譯表中的圖案索引來替代原始光柵數(shù)據(jù)中的相應(yīng)圖案,減少原始數(shù)據(jù)大小。看起來和調(diào)色板圖象的實(shí)現(xiàn)原理差不多,但是應(yīng)該注意到的是,我們這里的編譯表不是事先創(chuàng)建好的,而是根據(jù)原始圖象數(shù)據(jù)動態(tài)創(chuàng)建的,解碼時(shí)還要從已編碼的數(shù)據(jù)中還原出原來的編譯表(GIF文件中是不攜帶編譯表信息的),為了更好理解編解碼原理,我們來看看具體的處理過程:

編碼器(Compressor)

  編碼數(shù)據(jù),第一步,初始化一個(gè)編譯表,假設(shè)這個(gè)編譯表的大小是12位的,也就是最多有4096個(gè)單位,另外假設(shè)我們有32個(gè)不同的字符(也可以認(rèn)為圖象的每個(gè)像素最多有32種顏色),表示為a,b,c,d,e...,初始化編譯表:第0項(xiàng)為a,第1項(xiàng)為b,第2項(xiàng)為c...一直到第31項(xiàng),我們把這32項(xiàng)就稱為根。
  開始編譯,先定義一個(gè)前綴對象Current Prefix,記為[.c.],現(xiàn)在它是空的,然后定義一個(gè)當(dāng)前字符串Current String,標(biāo)記為[.c.]k,[.c.]就為Current Prefix,k就為當(dāng)前讀取字符。現(xiàn)在來讀取數(shù)據(jù)流的第一個(gè)字符,假如為p,那么Current String就等于[.c.]p(由于[.c.]為空,實(shí)際上值就等于p),現(xiàn)在在編譯表中查找有沒有Current String的值,由于p就是一個(gè)根字符,我們已經(jīng)初始了32個(gè)根索引,當(dāng)然可以找到,把p設(shè)為Current Prefix的值,不做任何事繼續(xù)讀取下一個(gè)字符,假設(shè)為q,Current String就等于[.c.]q(也就是pq),看看在編譯表中有沒有該值,當(dāng)然。沒有,這時(shí)我們要做下面的事情:將Current String的值(也就是pq)添加到編譯表的第32項(xiàng),把Current Prefix的值(也就是p)在編譯表中的索引輸出到編碼流,修改Current Prefix為當(dāng)前讀取的字符(也就是q)。繼續(xù)往下讀,如果在編譯表中可以查找到Current String的值([.c.]k),則把Current String的值([.c.]k)賦予Current Prefix;如果查找不到,則添加Current String的值([.c.]k)到編譯表,把Current Prefix的值([.c.])在編譯表中所對應(yīng)的索引輸出到編碼流,同時(shí)修改Current Prefix為k ,這樣一直循環(huán)下去直到數(shù)據(jù)流結(jié)束。偽代碼看起來就像下面這樣:

 

Initialize String Table;
[.c.] = Empty;
[.c.]k = First Character in CharStream;
while ([.c.]k != EOF )
{
  if ( [.c.]k is in the StringTable)
  {
    [.c.] = [.c.]k;
  }
  else
  {
    add [.c.]k to the StringTable;
    Output the Index of [.c.] in the StringTable to the CodeStream;
    [.c.] = k;
  }
  [.c.]k = Next Character in CharStream;
}

Output the Index of [.c.] in the StringTable to the CodeStream;


來看一個(gè)具體的例子,我們有一個(gè)字母表a,b,c,d.有一個(gè)輸入的字符流abacaba。現(xiàn)在來初始化編譯表:#0=a,#1=b,#2=c,#3=d.現(xiàn)在開始讀取第一個(gè)字符a,[.c.]a=a,可以在在編譯表中找到,修改[.c.]=a;不做任何事繼續(xù)讀取第二個(gè)字符b,[.c.]b=ab,在編譯表中不能找,那么添加[.c.]b到編譯表:#4=ab,同時(shí)輸出[.c.](也就是a)的索引#0到編碼流,修改[.c.]=b;讀下一個(gè)字符a,[.c.]a=ba,在編譯表中不能找到:添加編譯表#5=ba,輸出[.c.]的索引#1到編碼流,修改[.c.]=a;讀下一個(gè)字符c,[.c.]c=ac,在編譯表中不能找到:添加編譯表#6=ac,輸出[.c.]的索引#0到編碼流,修改[.c.]=c;讀下一個(gè)字符a,[.c.]c=ca,在編譯表中不能找到:添加編譯表#7=ca,輸出[.c.]的索引#2到編碼流,修改[.c.]=a;讀下一個(gè)字符b,[.c.]b=ab,編譯表的#4=ab,修改[.c.]=ab;讀取最后一個(gè)字符a,[.c.]a=aba,在編譯表中不能找到:添加編譯表#8=aba,輸出[.c.]的索引#4到編碼流,修改[.c.]=a;好了,現(xiàn)在沒有數(shù)據(jù)了,輸出[.c.]的值a的索引#0到編碼流,這樣最后的輸出結(jié)果就是:#0#1#0#2#4#0.



來看一個(gè)具體的例子,我們有一個(gè)字母表a,b,c,d.有一個(gè)輸入的字符流abacaba。現(xiàn)在來初始化編譯表:#0=a,#1=b,#2=c,#3=d.現(xiàn)在開始讀取第一個(gè)字符a,[.c.]a=a,可以在在編譯表中找到,修改[.c.]=a;不做任何事繼續(xù)讀取第二個(gè)字符b,[.c.]b=ab,在編譯表中不能找,那么添加[.c.]b到編譯表:#4=ab,同時(shí)輸出[.c.](也就是a)的索引#0到編碼流,修改[.c.]=b;讀下一個(gè)字符a,[.c.]a=ba,在編譯表中不能找到:添加編譯表#5=ba,輸出[.c.]的索引#1到編碼流,修改[.c.]=a;讀下一個(gè)字符c,[.c.]c=ac,在編譯表中不能找到:添加編譯表#6=ac,輸出[.c.]的索引#0到編碼流,修改[.c.]=c;讀下一個(gè)字符a,[.c.]c=ca,在編譯表中不能找到:添加編譯表#7=ca,輸出[.c.]的索引#2到編碼流,修改[.c.]=a;讀下一個(gè)字符b,[.c.]b=ab,編譯表的#4=ab,修改[.c.]=ab;讀取最后一個(gè)字符a,[.c.]a=aba,在編譯表中不能找到:添加編譯表#8=aba,輸出[.c.]的索引#4到編碼流,修改[.c.]=a;好了,現(xiàn)在沒有數(shù)據(jù)了,輸出[.c.]的值a的索引#0到編碼流,這樣最后的輸出結(jié)果就是:#0#1#0#2#4#0.

解碼器(Decompressor)

  好了,現(xiàn)在來看看解碼數(shù)據(jù)。數(shù)據(jù)的解碼,其實(shí)就是數(shù)據(jù)編碼的逆向過程,要從已經(jīng)編譯的數(shù)據(jù)(編碼流)中找出編譯表,然后對照編譯表還原圖象的光柵數(shù)據(jù)。
  首先,還是要初始化編譯表。GIF文件的圖象數(shù)據(jù)的第一個(gè)字節(jié)存儲的就是LZW編碼的編碼大小(一般等于圖象的位數(shù)),根據(jù)編碼大小,初始化編譯表的根條目(從0到2的編碼大小次方),然后定義一個(gè)當(dāng)前編碼Current Code,記作[code],定義一個(gè)Old Code,記作[old]。讀取第一個(gè)編碼到[code],這是一個(gè)根編碼,在編譯表中可以找到,把該編碼所對應(yīng)的字符輸出到數(shù)據(jù)流,[old]=[code];讀取下一個(gè)編碼到[code],這就有兩種情況:在編譯表中有或沒有該編碼,我們先來看第一種情況:先輸出當(dāng)前編碼[code]所對應(yīng)的字符串到數(shù)據(jù)流,然后把[old]所對應(yīng)的字符(串)當(dāng)成前綴prefix [...],當(dāng)前編碼[code]所對應(yīng)的字符串的第一個(gè)字符當(dāng)成k,組合起來當(dāng)前字符串Current String就為[...]k,把[...]k添加到編譯表,修改[old]=[code],讀下一個(gè)編碼;我們來看看在編譯表中找不到該編碼的情況,回想一下編碼情況:如果數(shù)據(jù)流中有一個(gè)p[...]p[...]pq這樣的字符串,p[...]在編譯表中而p[...]p不在,編譯器將輸出p[...]的索引而添加p[...]p到編譯表,下一個(gè)字符串p[...]p就可以在編譯表中找到了,而p[...]pq不在編譯表中,同樣將輸出p[...]p的索引值而添加p[...]pq到編譯表,這樣看來,解碼器總比編碼器慢一步』,當(dāng)我們遇到p[...]p所對應(yīng)的索引時(shí),我們不知到該索引對應(yīng)的字符串(在解碼器的編譯表中還沒有該索引,事實(shí)上,這個(gè)索引將在下一步添加),這時(shí)需要用猜測法:現(xiàn)在假設(shè)上面的p[...]所對應(yīng)的索引值是#58,那么上面的字符串經(jīng)過編譯之后是#58#59,我們在解碼器中讀到#59時(shí),編譯表的最大索引只有#58,#59所對應(yīng)的字符串就等于#58所對應(yīng)的字符串(也就是p[...])加上這個(gè)字符串的第一個(gè)字符(也就是p),也就是p[...]p。事實(shí)上,這種猜測法是很準(zhǔn)確(有點(diǎn)不好理解,仔細(xì)想一想吧)。上面的解碼過程用偽代碼表示就像下面這樣:


Initialize String Table;
[code] = First Code in the CodeStream;
Output the String for [code] to the CharStream;

[old] = [code];
[code] = Next Code in the CodeStream;
while ([code] != EOF )
{
  if ( [code] is in the StringTable)
  {
    Output the String for [code] to the CharStream;
// 輸出[code]所對應(yīng)的字符串
    [...] = translation for [old]; // [old]所對應(yīng)的字符串
    k = first character of translation for [code]; // [code]所對應(yīng)的字符串的第一個(gè)字符
    add [...]k to the StringTable;
    [old] = [code];

  }
  else
  {
    [...] = translation for [old];
    k = first character of [...];
    Output [...]k to CharStream;
    add [...]k to the StringTable;
    [old] = [code];

  }
  [code] = Next Code in the CodeStream;
}



 

posted on 2009-10-30 17:34 李陽 閱讀(1494) 評論(1)  編輯 收藏 引用 所屬分類: 圖形圖像

評論:
# re: LZW算法和GIF數(shù)據(jù)壓縮 2012-12-01 09:31 | baozhi1992@gmail.com
在decompression那講的太好了!
我翻了幾十個(gè)blog/帖子,
就你講的我看明白了!!!!!!!!!  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区日韩在线| 亚洲图片欧美一区| 免费日韩精品中文字幕视频在线| 亚洲风情在线资源站| 亚洲一品av免费观看| 一二美女精品欧洲| 亚洲一二三区精品| 欧美亚洲三级| 久久久中精品2020中文| 久久美女性网| 99精品国产福利在线观看免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 免费在线成人av| 亚洲国产精品va| 99国内精品久久久久久久软件| 亚洲婷婷在线| 老司机一区二区三区| 欧美视频一区在线| 激情五月婷婷综合| 亚洲午夜高清视频| 欧美高潮视频| 校园春色国产精品| 国产精品videosex极品| 欧美一级视频| 久久精品30| 国产精品av免费在线观看| 永久免费毛片在线播放不卡| 亚洲欧洲美洲综合色网| 午夜精品福利电影| 91久久精品久久国产性色也91 | 一本一道久久综合狠狠老精东影业 | 亚洲激情中文1区| 亚洲欧美日韩精品久久久| 欧美国产日韩一区二区三区| 香蕉亚洲视频| 影音国产精品| 欧美国产免费| 免费成人黄色| 日韩亚洲欧美一区二区三区| 男人的天堂成人在线| 久久久最新网址| 亚洲黄色片网站| 亚洲国产高清在线| 欧美色区777第一页| 亚洲一区www| 性欧美超级视频| 很黄很黄激情成人| 亚洲欧洲一区二区在线观看| 欧美性色综合| 久久久久国产精品一区| 久久先锋资源| 在线综合亚洲欧美在线视频| 亚洲国产精品电影在线观看| 亚洲精品视频一区二区三区| 欧美日韩午夜剧场| 久久精品欧美| 欧美日韩精品免费观看视频完整| 性色一区二区| 欧美aⅴ99久久黑人专区| 亚洲一区免费观看| 欧美片第1页综合| 久久亚洲精品网站| 国产精品久久99| 欧美高清影院| 亚洲激情视频在线观看| 亚洲国产日韩综合一区| 国内精品视频666| 亚洲一区视频| 亚洲宅男天堂在线观看无病毒| 久久久久国产精品一区二区| 一区二区日韩伦理片| 久久男人av资源网站| 久久久国产精品亚洲一区 | 老色鬼精品视频在线观看播放| 亚洲色诱最新| 国产精品美女久久久久久2018| 亚洲精品乱码久久久久久日本蜜臀| 国产精品美女久久| 亚洲日本无吗高清不卡| 亚洲美女视频网| 欧美日韩国产一区| 亚洲精品国产精品乱码不99按摩 | 亚洲国产1区| 亚洲精品一区二区三区福利| 美女黄毛**国产精品啪啪| 国产精品毛片va一区二区三区| 亚洲高清视频一区| 99综合在线| 国产在线精品二区| 免费影视亚洲| 在线亚洲高清视频| 另类激情亚洲| 亚洲深夜福利视频| 国产欧美另类| 日韩网站在线观看| 国产精品久久久久av免费| 久久精品国产免费观看| 日韩午夜电影av| 久久久99国产精品免费| 夜夜嗨av一区二区三区四区| 国产精品日本一区二区| 免费不卡在线观看av| 亚洲欧美久久| 欧美怡红院视频| 亚洲视频一二| 夜夜爽99久久国产综合精品女不卡| 久久久亚洲成人| 亚洲欧美日韩国产中文在线| 亚洲人成毛片在线播放| 一区二区在线免费观看| 狠狠色丁香婷婷综合影院| 国产精品美女一区二区| 欧美视频在线免费看| 欧美日韩播放| 欧美吻胸吃奶大尺度电影| 国产精品成人aaaaa网站| 欧美日韩在线精品| 欧美午夜精品电影| 国产欧美丝祙| 亚洲日本视频| 亚洲午夜女主播在线直播| 午夜精品成人在线| 久久久久久久一区| 亚洲自拍偷拍麻豆| 国产精品99久久久久久白浆小说 | 亚洲美女黄色| 午夜精品久久久久久久久久久久久 | 亚洲国产mv| 亚洲桃色在线一区| 久久久国际精品| 99国产一区| 欧美99在线视频观看| 国产欧美在线视频| 亚洲麻豆av| 欧美国产综合一区二区| 香蕉久久a毛片| 欧美日韩国产片| 亚洲国产综合91精品麻豆| 午夜欧美理论片| 99精品视频网| 欧美日韩ab| 亚洲精品美女91| 免费观看国产成人| 久久国产欧美日韩精品| 国产精品久久久久久久app| 99视频一区| av成人免费在线观看| 欧美日韩免费一区| 在线综合亚洲欧美在线视频| 亚洲大胆在线| 欧美精品免费看| 亚洲伊人一本大道中文字幕| 日韩视频在线观看国产| 欧美激情综合网| 一区二区三区四区国产精品| 久久国产精品99久久久久久老狼 | 亚洲欧洲视频在线| 亚洲七七久久综合桃花剧情介绍| 久久久亚洲国产美女国产盗摄| 伊人久久男人天堂| 亚洲精品123区| 欧美性色视频在线| 久久免费99精品久久久久久| 久久免费精品视频| 亚洲大片精品永久免费| 亚洲美女性视频| 激情欧美一区二区三区| 亚洲人成毛片在线播放女女| 欧美体内she精视频| 久久伊人免费视频| 欧美午夜精品久久久久久久 | 亚洲精品久久久久久下一站| 亚洲日本免费电影| 狠狠色综合一区二区| 在线一区二区日韩| 亚洲精品永久免费精品| 久久国产精品一区二区三区四区 | 亚洲区在线播放| 性欧美精品高清| 欧美一区二区三区四区在线观看 | 亚洲欧美激情精品一区二区| 久热精品视频| 久久蜜桃资源一区二区老牛| 国产精品极品美女粉嫩高清在线 | 在线一区二区三区四区| 久久综合久久88| 久久久久综合网| 狠狠色狠狠色综合系列| 欧美在线观看视频在线| 久久久久国产一区二区三区四区| 欧美日韩在线三区| 亚洲深夜福利在线| 久久动漫亚洲| 精品99一区二区三区| 久久亚洲精选| 韩国欧美国产1区| 久久久久这里只有精品| 欧美成人精品激情在线观看| 国产一区二区三区在线观看免费 | 99视频一区二区|