收藏 分享(赏)

熵编码.doc

上传人:11xg27ws 文档编号:8021887 上传时间:2019-06-04 格式:DOC 页数:13 大小:235.61KB
下载 相关 举报
熵编码.doc_第1页
第1页 / 共13页
熵编码.doc_第2页
第2页 / 共13页
熵编码.doc_第3页
第3页 / 共13页
熵编码.doc_第4页
第4页 / 共13页
熵编码.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、熵编码熵编码(entropy encoding)是一类利用数据的统计信息进行压缩的无语义数据流之无损编码。本章先介绍熵的基本概念,然后介绍香农-范诺(Shannon-Fano)编码、哈夫曼(Huffman)编码、算术编码(arithmetic coding)、行程编码(RLE)和 LZW 编码等常用的熵编码方法。1 熵熵(entropy)本来是热力学中用来度量热力学系统无序性的一种物理量(热力学第二定律:孤立系统内的熵恒增):对可逆过程, (孤立系统)0 ,TdQS其中,S 为熵、Q 为热量、T 为绝对温度。(信息)熵 H 的概念则是美国数学家 Claude Elwood Shannon(香农

2、 /仙农 / 向农)于 1948 年在他所创建的信息论中引进的,用来度量信息中所含的信息量:(为自信息量 的均值/数学期望)iipsI1log)(2iipSH1log)(2其中,H 为信息熵(单位为 bit),S 为信源,p i 为符号 si 在 S 中出现的概率。例如,一幅 256 级灰度图像,如果每种灰度的像素点出现的概率均为 pi=1/256,则82log56l1log22 iI )( l1ll 825022502 bitpHiii 即编码每一个像素点都需要 8 位(I ),平均每一个像素点也需要 8 位(H) 。2 Shannon-Fano 编码按照 Shannon 所提出的信息理论,

3、1948 年和 1949 年分别由 Shannon 和 MIT 的数学教授 Robert Fano 描述和实现了一种被称之为香农-范诺(Shannon-Fano)算法的编码方法,它是一种变码长的符号编码。 算法Shannon-Fano 算法采用从上到下的方法进行编码:首先按照符号出现的概率排序,然后从上到下使用递归方法将符号组分成两个部分,使每一部分具有近似相同的频率,在两边分别标记 0 和 1,最后每个符号从顶至底的 0/1 序列就是它的二进制编码。 例子例如,有一幅 40 个像素组成的灰度图像,灰度共有5 级,分别用符号 A、B、C、 D 和 E 表示,40 个像素中各级灰度出现次数见表

4、2。如果直接用二进制编码,则 5 个等级的灰度值需要 3 位表示,也就是每个像素用 3位表示,编码这幅图像总共需要 40 * 3 = 120 位。按照香农理论,这幅图像的熵为H = (15/40)log2(40/15) + (7/40)log2 (40/7) + (7/40)log2(40/7)+ (6/40)log2 (40/6) + (5/40) log2 (40/5) 2.196这就是说平均每个符号用 2.196 位表示就够了,40 个像素共需用 87.85 位,压缩比约为 3 / 2.196 1.366 : 1。按照 Shannon-Fano 算法,先按照符号出现的频度或概率排序:A、

5、B 、 C、D、 E,然后分成次数相近的左右两个部分AB(22)与 CDE(18),并在两边分别标记 0 和 1(见图 1)。然后类似地再将 AB 分成 A(15)与 B(7)、CDE 分成 C(7)与 DE(11),最后再把 DE 分成 D(6)与 E(5),参见图 2 和表 3。按照这种方法进行编码得到的总位数为 91,平均码长为 91/40 = 2.275,实际的压缩比为 120 / 91 1.319 : 1。3 Huffman 编码 哈夫曼编码Fano 的学生 David Albert Huffman(哈夫曼/ 赫夫曼/霍夫曼)在 1952 年提出了一种从下到上的编码方法,它是一种统计

6、最优的变码长符号编码,让最频繁出现的符号具有最短的编码。1编码过程Huffman 编码的过程 = 生成一棵二叉树(H 树),树中的叶节点为被编码符号及符号 A B C D E出现的次数157 7 6 5符号次数(p i) log2(1/pi)编码需位数A 15 (0.375)1.4150 00 30B 7 (0.175) 2.5145 01 14C 7 (0.175) 2.5145 10 14D 6 (0.150) 2.7369 110 18E 5 (0.125) 3.0000 111 15合计40 (1) 12.1809 91表 2 符号在图像中出现的数目0CDE1AB图 1 两边标记 0

7、和 1表 3 Shannon-Fano 算法举例表图 2 香农-范诺算法编码举例图其概率、中间节点为两个概率最小符号(串)的并所构成的符号串及其概率所组成的父节点、根节点为所有符号之串及其概率 1。2编码步骤(1) 将符号按概率从小到大顺序从左至右排列叶节点;(2) 连接两个概率最小的顶层节点来组成一个父节点,并在到左右子节点的两条连线上分别标记 0 和 1;(3) 重复步骤 2,直到得到根节点,形成一棵二叉树;(4) 从根节点开始到相应于每个符号的叶节点的 0/1 串,就是该符号的二进制编码。由于符号按概率大小的排列既可以从左至右、又可以从右至左,而且左右分枝哪个标记为 0 哪个标记为 1

8、是无关紧要的,所以最后的编码结果可能不唯一,但这仅仅是分配的代码不同,而代码的平均长度是相同的。3例子仍以上小节的 40 像素的图像为例,来进行 Huffman 编码,参见图 3 和表 4。ABCDE(1)0 1BCDE(0.625)0 1DE(0.275) BC(0.35)0 1 0 1E(0.125) D(0.15) C(0.175) B(0.175) A(0.375) 平均码长为 90/40 = 2.25,压缩比也为 120/90= 4/3 1.333 : 1。 香农- 范诺编码与哈夫曼编码香农-范诺编码和哈夫曼编码都属于不对称、无损、变码长的熵编码。1同步代码它们的码长虽然都是可变的,

9、但却都不需要另外附加同步代码(即在译码时分割符号的特殊代码)。如上例中,若哈夫曼编码的码串中的头两位为 01,那末肯定是符号A,因为表示其他符号的代码没有一个是以 01 开始的,因此下一位就表示下一个符号代码的第 1 位。同样,如果出现“000”,那么它就代表符号 C。如果事先编写出一本解释各种代码意义的“词典”,即码簿(H 表),那么就可以根据码簿一个码一个码地依次进行译码。2问题采用香农-范诺编码和哈夫曼编码时有两个问题值得注意: 没有错误保护功能,在译码时,如果码串中有哪怕仅仅是 1 位出现错误,则不但这个码本身译错,而且后面的码都会跟着错。称这种现象为错误传播符号次数(p i) log

10、2(1/pi)编码需位数A 15 (0.375)1.4150 1 15B 7 (0.175) 2.5145 011 21C 7 (0.175) 2.5145 010 21D 6 (0.150) 2.7369 001 18E 5 (0.125) 3.0000 000 15合计40 (1) 12.1809 90图 3 Huffman 编码过程例表 4 Huffman 算法举例表(error propagation),计算机对这种错误也无能为力,不能知道错误出在哪里,更谈不上去纠正它。 是可变长度码,因此很难在压缩文件中直接对指定音频或图像位置的内容进行译码,这就需要在存储代码之前加以考虑。3比较与

11、香农-范诺编码相比,哈夫曼编码方法的编码效率一般会更高一些。尽管存在上面这些问题,但哈夫曼编码还是得到了广泛应用。 H 表与自适应哈夫曼编码1H 表利用哈夫曼方法进行编解码,在编码时需要计算造 H 表(哈夫曼表),存储和传输时需要存储和传输 H 表,解码时则需要查 H 表。有时为了加快编码速度、减少存储空间和传输带宽,可以对多媒体数据使用标准的 H 表,但其压缩率一般比计算所造的表稍低。所以,如果只关心编码速度、存储空间和传输带宽,可以采用标准 H 表方法;如果更关心压缩质量和压缩比,则可以自己计算造 H 表。即使是计算造表,也一般只对高频符号计算编码,而对其他符号则直接编码。这种方法尤其适用

12、于有大量不同的输入符号,但只有少数高频符号的情况。2自适应哈夫曼编码还有一种自适应哈夫曼编码(adaptive Huffman coding),不需要存储和传输 H 表,而是按与编码严格一致的方法建立同样的 H 表,还可以利用兄弟节点的特征来加快更新H 树的过程。由于时间有限,这里就不做详细介绍。4 算术编码算术编码(arithmetic coding)是由 P.Elias 于 1960 年提出雏形、R.Pasco 和 J.Rissanen于 1976 年提出算法,由 Rissanen 和 G.G.Langdon 于 1979 年系统化并于 1981 年实现,最后由 Rissanen 于 19

13、84 年完善并发布的一种无损压缩算法。从信息论上讲是与Huffman 编码一样的最优变码长的熵编码。其主要优点是,克服了 Huffman 编码必须为整数位,这与实数的概率值相差大的缺点。如在 Huffman 编码中,本来只需要 0.1 位就可以表示的符号,却必须用 1 位来表示,结果造成 10 倍的浪费。算术编码所采用的解决办法是,不用二进制代码来表示符号,而改用0,1) 中的一个宽度等于其出现概率的实数区间来表示一个符号,符号表中的所有符号刚好布满整个0,1)区间(概率之和为 1)。把输入符号串(数据流)映射成 0,1)区间中的一个实数值。 编码方法符号串编码方法:将串中使用的符号表按原编码

14、(如字符的 ASCII 编码、数字的二进制编码)从小到大顺序排列成表,计算表中每种符号 si 出现的概率 pi,然后依次根据这些符号概率大小 pi 来确定其在 0, 1)期间中对应的小区间范围x i, yi):表 5 符号表(符号及其概率与区间), .mipxypxiiijj 1 , ,10其中,p 0 = 0。显然,符号 si 所对应的小区间的宽度就是其概率 pi。参见图 4。s1 s2 si sm0|x1 p1 y1|x2 p2 y2 xi pi yi xm pm ym|1图 4 算术编码的字符概率区间然后对输入符号串进行编码:设串中第 j 个符号 cj 为符号表中的第 i 个符号 si,

15、则可根据 si 在符号表中所对应区间的上下限 xi 和 yi,来计算编码区间 Ij = lj, rj):, .njdlrxdl ijjjijjj 1 , ,11 其中,d j = rj - lj 为区间 Ij 的宽度,l 0 = 0,r 0 = 1,d 0 = 1。显然,lj 而 dj 与 rj。串的最后一个符号所对应区间的下限 ln 就是该符号串的算术编码值。例如:输入符号串为“helloworld”(10 个字符),符号表含 7 个符号,按字母顺序排列,容易计算它们各自出现概率和所对应的区间,参见表 5。表 6 是对输入符号串“helloworld”的编码过程。表 6 算术编码的编码过程表

16、序号符号li ri di0 初值0.0 1.0 1.01 h (0.0+1.0*0.2=) 0.2 (0.0+1.0*0.3=) 0.3 (0.3-0.2=) 0.12 e (0.2+0.1*0.1=) 0.21 (0.2+0.1*0.2=) 0.22 (0.22-0.21=) 0.013 l (0.21+0.01*0.3=) 0.213 (0.21+0.01*0.6=) 0.216 (0.216-0.213=) 0.0034 l (0.213+0.003*0.3=) 0.2139 (0.213+0.003*0.6=) 0.2148 (0.2148-0.2139=) 0.00095 o (0.

17、2139+0.0009*0.6=) 0.21444(0.2139+0.0009*0.8=) 0.21462(0.21462-0.21444=) 0.000186 w 0.214602 0.214620 0.00000187 o 0.2146128 0.2146164 0.000000368 r 0.21461568 0.21461604 0.0000000369 l 0.214615788 0.214615896 0.000000010810 d 0.2146157880 0.2146157988 0.00000000108编码输出为 l10 = 0.2146157880。算术编码的过程,也可

18、以用图 5 的映射来表示。序号符号pi xi, yi)1 d 0.10.0, 0.1)2 e 0.10.1, 0.2)3 h 0.10.2, 0.3)4 l 0.30.3, 0.6)5 o 0.20.6, 0.8)6 r 0.10.8, 0.9)7 w 0.10.9, 1.0)d e h l o r w0.0 0.1 0.2 0.3 0.6 0.8 0.9 1.0hd he hh hl ho hr hw0.2 0.21 0.22 0.23 0.26 0.28 0.29 0.3hed hee heh hel heo her hew0.21 0.211 0.212 0.213 0.216 0.21

19、8 0.219 0.22held hele helh hell helo helr helw0.213 0.2133 0.2136 0.2139 0.2148 0.2154 0.2157 0.216 helloworl0.21461568 0.214615788 0.214615896 0.21461604helloworld0.214615788 0.2146158960.2146157880 输出 0.2146157988图 5 算术编码的过程 解码方法由符号表(包括符号对应的概率与区间)和实数编码 ln,可以按下面的解码算法来重构输入符号串:设 v1 = ln = 码值若 vj x i

20、, yi) c j = si , j = 1, , nvj+1 = (vj - xi) / pi , j = 1, , n-1例如上例的解码过程见下表 7,重构输入符号串为 v10 = “helloworld”。 若干说明1问题在算术编码中需要注意的几个问题:(1) 由于实际计算机的浮点运算器不够长(一般为 80 位),可用定长的整数寄存器低进高出来接收码串,用整数差近似实数差来表示范围,但可能会导致误差积累。(2) 算术编码器对整个消息只产生一个码字,这个码字是在间隔0, 1)中的一个实数,因此译码器在接受到表示这个实数的所有位之前不能进行译码。(3) 算术编码也是一种对错误很敏感的编码方法

21、,如果有一位发生错误就会导致整个字符序列被译错。2静态与自适应算术编码可以是静态的或者自适应的。在静态算术编码中,信源符号的概率是固定的。在自适应算术编码中,信源符号的概率根据编码时符号出现的频繁程度动态地进行j vj i cj = s i1 0.2146157880 3 h2 (0.2146157880 - 0.2) / 0.1 = 0.146157882 e3 (0.14615788 - 0.1) / 0.1 = 0.4615788 4 l4 (0.4615788 - 0.3) / 0.3 = 0.538596 4 l5 (0.538596 - 0.3) / 0.3 = 0.79532 5

22、 o6 (0.79532 - 0.6) / 0.2 = 0.9766 7 w7 (0.9766 - 0.9) / 0.1 = 0.766 5 o8 (0.766 - 0.6) / 0.2 = 0.83 6 r9 (0.83 - 0.8) / 0.1 = 0.3 4 l10(0.3 - 0.3) / 0.3 = 0.0 1 d表 7 算术编码的解码过程表修改。需要开发动态算术编码的原因是因为事先知道精确的信源概率是很难的,而且是不切实际的。当压缩数据时,我们不能期待一个算术编码器获得最大的效率,所能做的最有效的方法是在编码过程中估算概率,它成为确定编码器压缩效率的关键。5 RLE行程编码 RLE

23、(Run Length Encoding 游程长度编码)是一种使用广泛的简单熵编码。它被用于 BMP、JPEG/MPEG 、TIFF 和 PDF 等编码之中,还被用于传真机。 RLE 的编码方法RLE 视数字信息为无语义的字符序列(字节流),对相邻重复的字符,用一个数字表示连续相同字符的数目(称为行程长度),可达到压缩信息的目的。如未压缩的数据:ABCCCCCCCCDEFFGGGRLE 编码:AB8CDEFF3G对比该 RLE 编码例前后的代码数可以发现,在编码前要用 17 个代码表示的数据,而编码后只要用 10 个代码,压缩比为 1.7 : 1。这说明 RLE 确实是一种压缩技术,而且这种编

24、码技术相当直观,也非常经济。RLE 所能获得的压缩比有多大,这主要是取决于数据本身的特点。如果图像数据(如人工图形)中具有相同颜色的图像块越大,图像块数目越少,获得的压缩比就越高。反之(如自然照片),压缩比就越小。RLE 译码采用与编码相同的规则,还原后得到的数据与压缩前的数据完全相同。因此,RLE 是一种无损压缩技术。RLE 压缩编码特别适用于计算机生成的图形,对减少这类图像文件的存储空间非常有效。然而,RLE 对颜色丰富多变的自然图像就显得力不从心,这时在同一行上具有相同颜色的连续像素往往很少,而连续几行都具有相同颜色值的连续行数就更少。如果仍然使用 RLE 编码方法,不仅不能压缩图像数据

25、,反而可能使原来的图像数据变得更大。但是,这并不意味着 RLE 编码方法在自然图像的压缩中毫无用处,恰恰相反,在各种自然图像的压缩方法中(如 JPEG),仍然不可缺少 RLE。只不过,不是单独使用RLE 一种编码方法,而是和其他压缩技术联合应用。 BMP 中的 RLE1编码在 BMP 文件中,对 16 色和 256 色的普通格式的位图可进行 RLE 压缩(BI_RLE4 和 BI_RLE8),编码由若干信息单位构成,每个信息单位有 2 个字节。信息单位的第一个字节一般为同一颜色索引的像素数,这时第二个字节对 BI_RLE8为一个颜色索引(8b),对 BI_RLE4 为两个颜色索引(各 4b,高

26、 4 位为第一个像素,低 4第一字节0:重复的像素数BI_RLE8:一个颜色索引值(8b)第二字节BI_RLE4:两个颜色索引值(各 4 b,高 4 位为第一个像素,低 4 位为第二个像素)表 8 BMP 的 RLE 编码信息单位的组成 1表 9 BMP 的 RLE 编码信息单位的组成 2位为第二个像素)。参见表 8。若信息单位的第一个字节为 0,这时,第二个字节表示特殊意义:0线结束、1位图结束、2偏移(后跟的两个字节分别表示从当前位置向右和向下偏移的像素数)、3255后跟的未压缩的像素(颜色索引)数(填充到双字节边界,不足时补 0)。参见表 9。2例子1)BI_RLE8Compressed

27、 data Expanded data03 04 04 04 0405 06 06 06 06 06 0600 03 45 56 67 00 45 56 6702 78 78 7800 02 05 01 Move 5 right and 1 down02 78 78 7800 00 End of line09 1E 1E 1E 1E 1E 1E 1E 1E 1E 1E00 01 End of RLE bitmap2)BI_RLE4Compressed data Expanded data03 04 0 4 005 06 0 6 0 6 000 06 45 56 67 00 4 5 5 6 6

28、704 78 7 8 7 800 02 05 01 Move 5 right and 1 down04 78 7 8 7 800 00 End of line09 1E 1 E 1 E 1 E 1 E 100 01 End of RLE bitmap6 LZW 算法LZW 算法被 GIF 和 PNG 格式的图像压缩所采用,并被广泛应用于文件的压缩打包(如 ZIP 和 RAR)和磁盘压缩。因为它不需要执行那么多的缀符串比较操作,所以 LZW 算法的速度比 LZ77 算法的快。对 LZW 算法进一步的改进是增加可变的码字长度,以及在词典中删除老的缀符串。在 GIF 图像格式和各种文件和磁盘压缩程序

29、中已经采用了这些改进措施之后的LZW 算法。LZW 是一种专利算法,专利权的所有者是美国的一个大型计算机公司Unisys(优利系统公司)。不过,除了商业软件生产公司需要支付专利费外,个人则是可以免费使用 LZW 算法的。 概述1977 年以色列 Jakob Ziv 和 Abraham Lempel 提出了一种基于词典编码的压缩缩法,称为 LZ77 算法; 1978 年他们对该算法作了改进,称为 LZ78;1984 年 Terry A.Weltch又对 LZ78 进行了实用性修正,因此把这种编码方法称为 LZW(Lempel-Ziv Walch)算法。第一字节0:特殊含义0:线结束1:位图结束2

30、:偏移(后跟的两个字节分别表示从当前位置向右和向下偏移的像素数)?第二字节3255:后跟的未压缩的像素(色索引)数1词典编码的思想 词典编码(dictionary encoding)的根据是数据(字符串)本身包含有重复代码块(词汇)这个特性。词典编码法的种类很多,可以分成两大类。第一类词典编码的想法,是试图查找正在压缩的字符序列(词汇)是否在以前输入的数据中出现过,然后用已经出现过的字符串替代重复的部分,它的输出仅仅是指向早期出现过的字符串(词汇)的“指针”,参见图 6。第二类词典编码的想法,是试图从输入的数据中创建一个“短语词典(dictionary of the phrases)”,这种“

31、短语”(词汇/单词)不一定是像“computer 计算机”和“programming程序设计”这类具有具体含义的短语,它可以是任意字符的组合。编码数据过程中当遇到已经在词典中出现的“短语”时,编码器就输出这个词典中的短语的“索引号”,而不是短语本身,参见图 7。2LZW 与 LZ78LZ78 是首个第二类词典编码,1984 年提出的 LZW 压缩编码也属于这类编码,它是对 LZ78 进行了实用性修正后提出的一种逻辑简单、速度快、硬件实现廉价的压缩算法,并首先在高速硬盘控制器上应用了这种算法。在 LZW 算法中使用的术语与 LZ78 使用的相同,仅增加了一个术语 前缀根(Root),它是由单个字

32、符串组成的缀符串(String)。在编码原理上,LZW 与 LZ78 相比有如下差别: LZW 只输出代表词典中的缀符串 (String)的码字(code word)。这就意味在开始时词典不能是空的,它必须包含可能在字符流出现中的所有单个字符,即前缀根(Root)。 由于所有可能出现的单个字符都事先包含在词典中,每个编码步骤开始时都使用 1 个字符的前缀(one-character prefix),因此在词典中搜索的第 1 个缀符串有两个字符。 LZW 编码LZW 算法是一种基于字典的编码将变长的输入符号串映射成定长的码字形成一本短语词典索引(串表),利用字符出现的频率冗余度及串模式高使用率冗

33、余度达到压缩的目的。该算法只需一遍扫描,且具有自适应的特点(从空表开始逐步生成串表,码字长从像素位数 n+1 逐步增加到 12),不需保存和传送串表。图 6 第一类词典编码概念图 7 第二类词典编码概念串表具有前缀性若串 wc(c 为字符)在表中,则串 w 也在串表中(所以,可初始化串表为含所有单个字符的串)。匹配采用贪婪算法每次只识别与匹配串表中最长的已有串 w(输出对应的码字)、并可与下一输入字符 c 拼成一个新的码字 wc。对串表的改进:用 w 的码字来代替 wc 中的 w,则串表中的串等长;当串表已满时(一般表长为 212),可清表重来(输出清表码字)。清表码字=2n,结束码字=1+2

34、n。所以,第一个可用的多字符串的码字=2+2n 。1LZW 压缩算法:初始化:将所有单个字符的串放入串表 ST 中;(共 2n 项码字为 02n-1,实际操作时不 必放入,只需空出串表的前 2n 项,字符对应码字所对应的串表索引即可)读首字符入前缀串 w;设置码长 codeBits=n+1;设置串表中当前表项的索引值 next=初始码字=2n+2 ;循环: 读下一输入字符 c;若 c=EOF(文件结束符),则输出 w 的码字,结束循环(输出结束码字);若 wc 已在串表中,则 w=wc,转到循环开始处;否则,输出 w 的码字,将 wc 放入 ST 中的 next 处,next+;令 w=c,转

35、到循环开始处;若 next 的位数超过码长(codeBits),则 codeBits+;若串表已满(next 的位数已超过最大码长 12),则清空串表,输出清表码字,转到 初始化开始处。2LZW 还原算法:初始化:将所有单个字符的串放入串表 ST 中;(共 2n 项码字为 02n-1,实际操作时不 必放入,只需空出串表的前 2n 项,字符对应码字对应串表索引即可)串表中当前表项的索引 next=2n+2;设置码长 codeBits=n+1;读首个码字(所对应的单个字符)入老串 old,输出该字符;循环: 读下一码字 new;若 new=结束码字,结束循环;若 new=清表码字,则清空串表,转到

36、初始化开始处;若 new=next,则输出串 newStr= old+old0(例外处理);若 newcodeBits),则 codeBits+;但若加一后的 codeBits 12,则重新让 codeBits = 12;old=newStr,转到循环开始处。其中:newStr=STnew(即串表中索引为 new 的串)3例子被编码字符串见表 10,它只包含 3 个不同的单字符 A、B、C。编码过程如表 11,译码过程如表 12。表 11 LZW 的编码过程 表 12 LZW 的译码过程步骤码字词典 输出(1)A(2)B(3)C1 (1) - - A2 (2) (4)AB B3 (2) (5)

37、BB B4 (4) (6)BA AB5 (7) (7)ABA(例外) ABA6 (3) (8)ABAC C步骤位置词典 输出(1)A(2)B(3)C1 1 (4)AB (1)2 2 (5)BB (2)3 3 (6)BA (2)4 4 (7)ABA (4)5 6 (8)ABAC(7)6 - - - (3)其中:“步骤”栏表示编码步骤;“位置”栏表示在输入数据中的当前位置;“词典”栏表示添加到词典中的缀符串,它的索引在括号中;“输出”栏表示码字输出。 每个译码步骤译码器读一个码字,输出相应的缀符串,并把它添加到词典中。例如,在步骤 4 中,先前码字(2)(对应于单字符串“B”)存储在老码字(old

38、)中,当前码字(new)是(4),对应的当前缀符串 newStr 是输出( “AB”),先前缀符串 old (“B“)加上当前缀符串 newStr (“AB“)的第一个字符“A ”,其结果 old+newStr0(“BA“) 添加到词典中(STnext),它的索引号 next 是(6) 。 GIF 文件格式可交换图形格式(GIF=Graphics Interchange Format),由 CompuServe 公司于 87 年起定义,现有 87a 与 89a 两个主要版本,采用变长 LZW 压缩算法,只支持索引色(最多 8 位)。GIF 文件的格式见表 1318:(其中,多字节整数的低位在前

39、,无符号)表 13 GIF 文件格式 表 14 全局标志位置1 2 3 4 5 6 7 8 9字符A B B A B A B A C表 10 编码字符串位 名称 大小含义02pixel 3b pixelBits-13reserved (87a)1b保留,必须为 0sort (89a)=0 色表未排序=1 色表已按重要性排序46cr 3b colorBits-17 M 1b =0 无全局色表=1 有全局色表内容 大小 取值标识 3B 必须为”GIF”版本 3B ”87a”或”89a”图像宽度 2B 像素数图像高度 2B 像素数全局标志 1B 定全局色表选项背景色索引1B 用于图外色像素纵横比1B

40、 一般为 0全局色表 N*3B可选,每项为RGB数据块 变长 可多个GIF 结束符1B ;(59,0x3B)其中:像素位数 n = pixelBits = pixel+1 = 颜色位数 colorBits = cr+1 = 18,颜色数 N = 2pixelBits = 2colorBits = 2(18) = 2、4、8、16、32、64、128、256。像素纵横比:若 = 0,则为 1:1;若 0,则 Aspect Ratio = (Pixel Aspect Ratio + 15) / 64。表 15 数据块格式 1(图像块) 表 16 局部标志位 名称 大小含义02pixel 3b pi

41、xelBits-134reserved 2b 保留,必须为 05reserved (87a)1b保留,必须为 0sort (89a)=0 色表未排序=1 色表已按重要性排序6 I 1b =0 顺序编码=1 行交叉编码7 M 1b =0 用全局色表=1 有局部色表内容 大小 取值图像分隔符 1B ,(44,0x2C)图像左边 左上角坐标2B 像素数图像顶端 2B 像素数图像宽度 2B 像素数图像高度 2B 像素数局部标志 1B 定局部色表及交叉选项编码长度 1B 位数局部色表 N*3B可选,RGB数据子块子块大小bc1B可选,可多个图像编码 bcB子块序列结束符 1B 0(大小为 0 的子块)其

42、中:像素位数 n = pixelBits = pixel+1 = 18,颜色数 N = 2pixelBits = 2(18)I=1 时为行交叉编码(用于渐显),行的交叉顺序为(4 遍扫描):第一遍:0 行、8 行、8i 行、(0 行起,隔 8 行)第二遍:4 行、12 行、8i+4 行、(4 行起,隔 8 行)第三遍:2 行、6 行、4i+2 行、(2 行起,隔 4 行)第四遍:1 行、3 行、2i+1 行、(1 行起,隔 2 行)编码长度(码长):初始码长,一般 = 像素位数 n。实际的初始码长 = n+1。表 17 数据块格式 2(扩展块) 表 18 扩展块内容 大小取值扩展块引导符 1B !(33,0x21)扩展功能代码 1B 代码编号(0255)功能子块子块大小bc1B可选,可多个功能数据 bcB块结束符 1B 0(大小为 0 的子块)功能代码 名称 功用0x01=1 普通文本块 含文本数据及其显示控制0xF9=249 图像控制块用于图像的显示与处理控制,可描述 GIF 动画。此数据块若有,必须位于图像块之前。0xFE=254 注释块 含图像的注释文本0xFF=255 应用块 含应用的特殊信息

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报