GIF图像格式(二)——基础算法(下)

接上回……

3、解码算法
解码算法的伪码描述如下:
initialze_string_table(root_number);                                                          
last_code = -1;                                                                               
current_string = '';         // 空字符串                                                       
    while (能够从Code Stream中取出一个Code: this_code) {                                        
    if (last_code==-1) {     // first code                                                    
        把Code对应的string输出到Char Stream;                                                    
    } else {                                                                                  
        if (this_code在string_table中存在) {                                                   
            current_string = string(last_code);                                               
            current_string += string(this_code)[0];  //this_code对应的string的第一个字符        
            把current_string插入到string_table的末尾;                                           
            把this_code对应的string输出到Char Stream;                                           
        } else {                                                                              
            current_string = string(last_code);                                               
            current_string += string(last_code)[0];  //last_code对应的string的第一个字符        
            把current_string插入到string_table的末尾;                                           
            把current_string输出到Char stream;                                                 
        }                                                                                     
    }                                                                                         
    last_code = this_code;                                                                    
}                                                                                             

这个算法有几个地方不好理解,首先就是last_code等于-1的时候,我们的做法就是简单的把Code对应的字符串输出来,这就有了一个问题:这个Code对应的string一定存在吗?让我们仔细想想编码的过程,第一个Code一定是root的index,因此这个string是一定存在的。第二个问题就是对this_code的处理。我们知道,在初始化string table的时候,它只有root_number个项,随着编码的过程,这个table一只增长,但是仍然可能存在得到了一个code却发现它在string table种对应的字符串还没有生成的情况。结合编码过程应该不难理解,如果不存在的话,那么这个Code也应当比当前的table中的最大的一个index仅仅大一,也就是说,如果我们可以用某种方法得到这个应当加入的项,那么它就是我们要找得项。第三个问题就是为什么我们总要在读出一个Code后就要把一个string插入到string_table中,仍然是参考编码过程,我们总是在输出了一个Code的同时生成一个string插入到table中,也就是说,在我们进行解码的时候,如果要让string_table和我们编码时同步,也要在读入一个Code后生成一个string插入到table中。最后一个问题就是对于“Code在string_table中不存在”这种情况的解决方法。从伪码中可以看到,如果Code存在,构造current_string和输出的方式都很好理解,但是如果不存在,似乎很无耻的使用了last_code莱得到current_string,其实仔细联系编码方式可以理解:这种方式是必然的。

还是看一个例子:仍然是刚才的例子,我们把我们编出来的码解回去。

第一步仍然是初始化string_table:
-----------------------
index            string
00                'A'
01                'B'
02                'C'
-----------------------
第二步开始解码:
Step        last_code        this_code       exist?         current_string                           Insert         output
01                -1                01                -                    -                                        -               'B'
02                01                03               no            string(01)+string(01)[0]=BB           'BB'            'BB'
03                03                02               yes           string(03)+string(02)[0]=BBC        'BBC'            'C'
04                02                03               yes           string(02)+string(03)[0]=CB           'CB'            'BB'
05                03                00               yes           string(03)+string(00)[0]=BBA        'BBA'            'A'
解码结束,输出为:BBBCBBA,成功地解为原字符串。
我们再看看现在的string_table:
-------------------------
index            string
00                'A'
01                'B'
02                'C'
03                'BB'
04                'BBC'
05                'CB'
06                'BBA'
-------------------------
与编码方式比较一下,是完全一样的。
由此可见,解码过程基本上是编码的逆过程,而且这两个过程之间的交流仅仅需要三个元素:Root Items的数目(字符集的大小)、字符集、字符集中各个字符的排列约定。而这三个东西其实是很容易指定的,这就决定了GIF图像可以不需要花太大空间存储这些东西,大大减小了文件大小。


(To be continue...)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值