GIF图片原理和储存结构深入解析(2)

GIF中扩展块都以0x21开始,后一个字节是扩展标签,标识扩展用途。
应用程序扩展的标签是0xFF,它包含有应用程序的标识信息和应用程序数据。其中 Netscape 应用程序扩展常用于控制GIF的动画循环次数。Netscape 扩展长19个字节,前14个是应用程序的ACSII信息,后四个是数据子块,用于指定GIF的循环次数, 按无符号整型存储,0表示无限循环。

图5:庖丁解牛:GIF图片原理和储存结构

图形控制扩展

21F90409 32000F00

图形控制扩展块属于”89a”版本的定义。它在一个图像数据块的最前端,用来指定图像的透明度与动画属性。图形控制扩展的开端两字节是0x21F9,其中0x21表示这是一个扩展,F9表示扩展用于图形控制。第三个字节是块大小(它到结束符之间的数据)。第四个字节是压缩字段,前三个Bit保留,四到六Bit是disposal method。第四、五个字节是图像控制扩展后面的图像的动画时间,以无符号整型存储。第六个字节是透明色索引,之后是块结束符0x00。

图6:庖丁解牛:GIF图片原理和储存结构

图像描述符

2C000000 000A000A 0000

图像描述符位于GIF中每一个图像数据的前端,由0x2C开始,长度为10个字节。第一个字节是图像描述符的标识0x2c,后面八个字节表示图像的frame(left, top, width, height),用来在动画中局部更新图像。最后一个是压缩字节,主要是关于局部颜色列表的信息,其中第二个Bit表示图像的存储方式是交织还是连续。

图7:庖丁解牛:GIF图片原理和储存结构

局部颜色列表
如果上面的局部颜色列表标志位为1,那么局部颜色列表会排列在图像描述符后面,它只对紧跟在它之后的图像数据有效。如果局部颜色列表标志位为0,那么图像数据将使用全局颜色列表索引颜色。局部颜色列表的大小计算方法和像素颜色格式与全局颜色列表相同。
图像数据

041C 1080472B 0549DA9B BAAE58E7 4D4F288E E629A519 697E1C0C 92DB1301 00

GIF的图像数据是经过LZW压缩的二进制流,通过解码可以将其按照颜色列表中的颜色进行像素填充。第一个字节是LZW最小编码大小,用来进行数据解码。第二个字节是图像数据的大小,之后的都是图像数据,直到块结束符。
结束符

3B

GIF的动画原理

GIF动画的循环次数是由应用扩展来控制的,而GIF动画每一帧的过渡方式是由图形控制扩展控制,图像描述符控制图像绘制的区域。
图形控制扩展中控制动画的参数分别是:disposal method,user input flag,delay time,transparency color。

disposal method
disposal method占3Bit,能够表示0-7。

disposal method = 1

解码器不会清理画布,直接将下一幅图像渲染上一幅图像上。

disposal method = 2

解码器会以背景色清理画布,然后渲染下一幅图像。背景色在逻辑屏幕描述符中设置。

disposal method = 3

解码器会将画布设置为上之前的状态,然后渲染下一幅图像。

disposal method = 4-7

保留值

user input flag
当user input flag为1时,GIF会在有用户输入事件(鼠标、键盘)时才会过渡到下一幅图像。

delay time
delay time占两个字节,为无符号整数,控制当前帧的展示时间,单位是0.01秒。

transparency color
如果图形控制扩展的透明色标志位为1,那么解码器会通过透明色索引在颜色列表中找到改颜色,标记为透明,当渲染图像时,标记为透明色的颜色将不会绘制,显示下面的背景。

图像渲染区域
GIF中图像描述符指定了当前帧需要渲染的区域,这样GIF的过渡动画就只用绘制两帧之间不同的区域,前提是diposal method的值为1。

实验

根据上面的知识,将第一帧的图形控制扩展改为:

21F90409 0A000900

这里将透明色改成了红色(红色在全局颜色列表中的索引是9),并将delay time改为0.1秒。修改完的GIF为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13690.html