您的位置:首页 > 其它

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

2004-10-03 19:38 323 查看
接上回……

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...)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: