当前位置:文档之家› GIF文件的数据结构以及播放和分解GIF的源代码

GIF文件的数据结构以及播放和分解GIF的源代码

GIF文件的数据结构以及播放和分解GIF的源代码GIF 文件内部是按块划分的,包括控制块和数据块两种。

控制块控制数据块的行为,不同的控制块包含不同的控制参数。

数据块只包含一些8bit的字符流,由它前面的控制块来决定它的功能,每个数据块0—255个字节,数据块的第一个字节指出这个数据块长度(字节数),计算数据块的长度时不包括这个字节,所以一个空的数据块也有一个字节,那就是数据块的大小&H00。

控制块中的逻辑屏幕描述块和全局彩色表的作用范围是整个数据流, 其他控制块仅控制跟在它们后面的图形描述块。

GIF文件的典型结构如下表所示。

---------------------------------------顺号结构名称长度(字节)---------------------------------------1GIF文件头 62逻辑屏幕描述块73全局彩色表≤7684图形描述块105局部彩色表(可重复n次)≤7686表式压缩图像数据7图像控制扩展块88无格式文本扩展块9注释扩展块4-25810 应用程序扩展块11 GIF文件结束块 1----------------------------------------一、控制块1. GIF文件头文件头由6个固定字节组成,结构如下表所示。

单位:字节---------------------偏移量长度域名称---------------------03GIF标记33版本号---------------------GIF标记存放的是“GIF”的Ascii码,版本号存放的是1987年5月发布的“87a”或者1989年7月发布的“89a”,或者更加新的版本号。

2. 逻辑屏幕描述块逻辑屏幕描述块紧跟在GIF文件头之后。

逻辑屏幕描述块由7个固定字节组成,包含定义图像显示区域的参数,包括背景颜色信息。

这个数据块中的坐标相对于虚拟屏幕的左上角,不一定是指显示屏幕的绝对坐标。

逻辑屏幕描述块的结构如下表所示:单位:字节--------------------------------偏移量长度域名称--------------------------------62逻辑屏幕宽度(像素)82逻辑屏幕高度(像素)101包装域111背景颜色索引12 1像素宽高比--------------------------------说明:(1) 包装域是描述彩色表属性的,这一个字节又由4个子域组成:0-2位:全局彩色表大小域Size,表示表示每个像素的位数,它用来计算全局彩色表中包含的字节数。

在全局彩色表标志域G=0 时就不需要计算,G=1 时就要计算彩色表的大小,具体计算见下文的"3. 全局彩色表"。

3位:彩色表排序标志域S,用来表示全局彩色表中的颜色是否按重要性(或者称使用率)排序。

如果S=0,表示没有重要性排序;如果S=1 表示最重要的颜色排在前。

这样做的目的是辅助颜色数比较少的解码器能够选择最好的颜色子集,在这种情况下解码器就可选择彩色表中开始段的彩色来显示图像。

4-6位:彩色分辨率域CR,用来表示原始图像可用的每种基色的位数(实际值减1)。

这个位数表示整个调色板的大小,而不是这幅图像使用的实际的颜色数。

例如,如果该域的值CR=3,说明原始图像可用每个基色有4位的调色板来生成彩色图像。

7位:全局彩色表标志域G 用来说明是否有全局彩色表存在。

如果G=1,表示有一个全局彩色表将紧跟在这个逻辑屏幕描述块之后;这个标志也用来选择背景颜色索引,如果G =1,背景颜色索引域中的值就用作背景颜色的索引。

(2)背景颜色索引是彩色表的一个索引值,用来指定背景颜色。

如果全局彩色表标志域G=0,这个域的值也设置为0。

(3) 像素宽高比域中的值是一个因数,是计算原始图像像素的宽高比的一个近似值。

如果该域的值范围为1~255,宽高比的近似值按下式计算:Aspect Ratio = (Pixel Aspect Ratio + 15) / 64比值的范围在4:1~1:4之间,其增量为1/64。

3. GIF文件结束块结束块在GIF文件的最后,它是一个固定的数值&H3B。

4、扩展控制块这一部分是可选的(需要89a版本),扩展控制块的标记是&H21(又称扩展导入符),用于识别扩展块的开始。

在扩展导入符后是扩展标签。

①图形控制扩展块用来控制跟在它后面的第一个图象(或文本)的渲染形式,扩展标签为&HF9,其结构如下表所示:单位:字节------------------------------------------偏移量长度域名称------------------------------------------01扩展导入符(&H21)11图形控制标签(&HF9)21块大小域(&H04)31包装域42延迟时间61透明色索引71块结束符(&H00)------------------------------------------说明:(1)块大小域用来说明该扩展块所包含字节数,该字节数是从块大小域之后到块结束符之前的字节数,固定为&H4。

(2)包装域的结构如下表所示:0位:透明标志1位:用户输入标志,表示在继续处理之前是否需要用户输入(按回车键或鼠标点击等)。

在延时时间和用户输入标志都设置为1的情况下,继续处理的开始时间取决于用户响应输入在前还是延迟时间结束在前。

2-4位:处理方法,处理方法规定图形显示之后译码器要用下表所述方法进行处理:--------------------------------------域值方法--------------------------------------0不使用处理方法1不处理图形,图形留在原处2显示图形的区域必须恢复成背景颜色3恢复成以前显示的图形4-7未定义--------------------------------------5-7位:保留的(3)延迟时间:单位1/100秒,如果值不为1,表示暂停规定的时间后再继续往下处理数据流。

(4)透明色索引:当透明标志位设置为1时,透明索引指示处理程序要修改显示设备上的相应像点。

(5)块结束符表示该图形控制扩展块结束,它是一个固定的数值&H0,因此称为零长度数据子块。

②无格式文本扩展块无格式文本扩展块用来绘制一个简单的文本图象,由纯文本数据(7-bit ASCII 字符)和控制绘制的参数等组成。

绘制文本借助于一个文本框来定义边界,在文本框中划分多个单元格,每个字符占用一个单元,绘制时按从左到右、从上到下的顺序依次进行,直到最后一个字符或者占满整个文本框(之后的字符将被忽略,因此定义文本框的大小时应该注意到是否可以容纳整个文本),绘制文本的颜色使用全局颜色列表,没有则可以使用一个已经保存的前一个颜色列表。

另外,图形文本扩展块也属于图形块(Graphic Rendering Block),可以在它前面定义图形控制扩展对它的表现形式进一步修改。

其扩展标签为&H1,结构如下表所示:单位:字节------------------------------------------------------------顺号长度域名称------------------------------------------------------------11扩展导入符(&H21)21无格式文本标签(&H1)31块大小(&H0C)42文本框离逻辑屏幕的左边界距离(像素)52文本框离逻辑屏幕的上边界距离(像素)62文本框宽度(像素)72文本框高度(像素)81每个单元宽度(像素)91每个单元高度(像素)101前景色在全局颜色列表中的索引111背景色在全局颜色列表中的索引12文本:一个或多个数据块组成,保存要显示的字符串131块结束符(&H00)------------------------------------------------------------说明:(1)由于文本的字体(Font)和尺寸(Size)没有定义,解码器应该根据情况选择最合适的(2)如果一个字符的ASCII码小于&H20或大于&HF7,则这个字符被推荐显示为一个空格(0x20)(3)为了兼容性,最好定义字符单元格的大小为8x8或8x16③注释扩展块注释扩展块域的内容用来说明图形、版权、描述等其他任何非图形数据和控制信息的文本信息(解码器完全可以忽略它)。

扩展标签为&HFE。

注释扩展块的结构如下表所示:单位:字节--------------------------------顺号长度域名称--------------------------------11扩展导入符(&H21)21注释标签(&HFE)31—255注释数据41块结束符(&H00)--------------------------------④应用扩展块应用扩展块是提供给应用程序自己使用的,应用程序可以在这里定义自己的标识、信息等,扩展标签为&HFF,结构如下表所示:单位:字节------------------------------------------------------顺号长度域名称------------------------------------------------------11扩展导入符(&H21)21扩展标签(&HFF)34块大小(&H0B)48应用程序标识符(ASCII码),典型值为NETSCAPE53应用程序鉴别码(ASCII码),典型值为2.07应用程序自定义数据块,典型值为&H381块结束符(&H00)------------------------------------------------------⑤全局彩色表全局彩色表紧跟在逻辑屏幕描述块之后。

由于一个GIF文件可以包含多幅彩色图像,每幅彩色图像也许都包含适合自身特点的彩色表,所以一个GIF文件可以有好几个彩色表。

但归纳起来只有两类:全局彩色表或局部彩色表。

全局彩色表可用于图像本身没有带彩色表的所有图像和无格式文本扩展块,而局部彩色表只用于紧跟在它后面的一幅图像。

在处理全局彩色表和局部彩色表时需要注意下面一些规则。

①如果GIF文件包含全局彩色表,而且要显示的图像本身又带有局部彩色表,那末显示该幅彩色图像时就用它自己的彩色表,而不用全局彩色表。

在这种情况下,解码器就首先保存全局彩色表,然后使用局部彩色表来显示图像,最后再回复全局彩色表。

相关主题