1 创建一个gif动态图片,两帧,每帧间隔显示时间为0.5s,第一帧为10*10像素蓝色(R:255,G:0,B:0)正方形,第二帧为10*10像素红色正方形(R:0,G:0,B:255),文件存储格式如图一所示:
图一
2 图二所示内容为文件头部分,包括GIF署名(Signature)和版本号(Version),GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"a"。
图二
3 图三所示内容为逻辑屏幕标识符,这一部分由7个字节组成,定义了GIF图象的大小(Logical Screen Width & Height)、颜色深度(Color Bits)、背景色(Blackground Color Index)以及有无全局颜色列表(Global Color Table)和颜色列表的索引数(Index Count)。
第一、二个字节(0A 00)为图像的宽度10像素。
第三、四个字节(0A 00)为图像的高度10像素
第五个字节为包装域,(A1)转换为二进制为【1 010 0 001】从右往左排序
0-2位001表示全局彩色表大小(Size of Global Color Table)表示表示每个像素的位数,它用来计算全局彩色表(Global Color Table)中包含的字节数。在全局彩色表标志(Global Color Table Flag)域G=0时就不需要计算,G=1时就要计算彩色表的大小, 001+1确定颜色列表的索引数(2的001+1次方).
3位0表示彩色表排序标志(Sort Flag)域,用来表示全局彩色表(Global Color Table)中的颜色是否按重要性(或者称使用率)排序。如果为0,表示没有重要性排序;如果为1表示最重要的颜色排在前。这样做的目的是辅助颜色数比较少的解码器能够选择最好的颜色子集,在这种情况下解码器就可选择彩色表中开始段的彩色来显示图像。
4-6位010表示彩色分辨率(Color Resolution)域,用来表示原始图像可用的每种基色的位数(实际值减1)。这个位数表示整个调色板的大小,而不是这幅图像使用的实际的颜色数。例如,如果该域的值CR=3,说明原始图像可用每个基色有4位的调色板来生成彩色图像。
7位1表示全局彩色表标志(Global Color Table Flag )域G用来说明是否有全局彩色表存在。如果G=1,表示有一个全局彩色表(Global Color Table)将紧跟在这个逻辑屏幕描述块(Logical Screen Descriptor)之后;这个标志也用来选择背景颜色索引(Background Color Index)。如果G=1,背景颜色索引(Background Color Index)域中的值就用作背景颜色的索引。
第六个字节(00)为背景颜色(在全局颜色列表中的索引,如果没有全局颜色列表,该值没有意义)。
第七个字节(00)为像素宽高比。
图三
4 图四所示内容为全局颜色列表,(00 00 FF)为蓝色,(FF 00 00)为红色
图四
5 图五所示内容为应用程序扩展块,从左往右排序:
第1个字节(21)标识这是一个扩展块,固定值0x21
第2个字节(FF)标识这是一个应用程序扩展块,固定值0xFF
第3个字节(0B)块大小,固定值11
第4-11个字节(4E 45 54 53 43 41 50 45)用来鉴别应用程序自身的标识(8个连续ASCII字符NETSCAPE)
第12-14个字节(32 2E 30)应用程序定义的特殊标识码(3个连续ASCII字符2.0)
第15-18个字节(03 01 00 00)表示为每个字节为一个应用程序自定义数据块,可有N个应用程序自定义数据块。
第19个字节(00)标识注释块结束,固定值0。
图五
6 图六所示内容为图形控制扩展块,此部分占8个字节:
第1个字节(21)标识这是一个扩展块,固定值0x21
第2个字节(F9)标识这是一个图形控制扩展块,固定值0xF9
第3个字节(04)块大小,不包括块终结器,固定值4
第4个字节(05)为包装域,(05)转换为二进制为【000 001 0 1】从右往左排序
0位(1)透明(Transparency Flag)表示是否给出透明索引(transparency index)
1位(0)表示位用户输入标志
2-4位(001)表示处置方法。
处置方法(Disposal Method):指出处置图形的方法,当值为:
0 - 没有指定要做任何处理
1 -不处理,图形留在原处
2 -显示图形的区域必须要恢复成背景颜色
3 -恢复成以前显示的图形
4-7 - 未定义
5-7位(000)保留
第5-6个字节(32 00)延时时间,表示暂停规定的时间后再继续往下处理数据流,0X32转换为10进制为50,一个单位代表0.01秒,50正好为0.5秒,和创建图片时设置的一致,取值范围为1-65535即0.1秒-10分钟之间。
第7个字节(02)表示透明色索引值
第8个字节(00)标识块终结,固定值0
图六
7 图七所示内容为图象标识符,一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C(',')字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成:
第1个字节(2C)表示图象标识符开始,固定值为','
第2-3个字节(00 00)表示X方向偏移量
第4-5个字节(00 00 )表示Y方向偏移量
第6-7个字节(0A 00)表示图像宽度,正好是10
第8-9个字节(0A 00)表示图像高度,正好是10
第10个字节(00)表示局部颜色列表标志,因无局部颜色列表,此部分内容不解释。
图七
8 图八所示内容为基于颜色列表的图象数据,由两部分组成:LZW编码长度(LZW Minimum Code Size)和图象数据(Image Data)。
第1个字节表示LZW编码初始码表大小的位数
其他字节表示图象数据,由一个或几个数据块(Data Sub-blocks)组成,具体每个字节表示意义请参考LZW算法,这里不做多解释。
图八
9 图九所示内容为GIF文件结束,固定值0x3B
图九