GIF图片原理和储存结构深入解析
《GIF图片原理和储存结构深入解析》要点: GIF是一种使用LZW压缩,支持多张图像的容器.支持256色,透明通道为1bit.作为互联网表情包的载体,GIF这项80年代的技术依然生生不息. GIF在iOS的尴尬处境长久以来,iOS一直被吐槽不克不及用GIF.造成这一局面的主要原因是:
GIF的存储结构由于历史的原因,GIF有两个版本,但它们的文件结构是一样的,都是由不同用途的数据块构成,可分为控制块和数据块.控制块里是决定GIF表现的参数,数据块里的数据由前面的控制块里的参数来解释. GIF布局 Header:包括文件签名与版本号. 这是它的十六进制数据,我用颜色区分了分歧的数据块: Paste_Image.png HeaderGIF文件的开头是 Header 数据块,长度为6字节,ASCII值为“GIF87a”或”GIF89a”,前三位为GIF签名,后三位为分歧年份的版本号. Paste_Image.png 利用这点,在iOS中判断二进制文件是否为GIF时,可以简单去判断它的前四位是否是”GIF8″.事实上绝年夜多数图像都可以用文件签名来判断类型. GIF 内容GIF数据包括多个数据块,其结构如下:
这一数据块由7个字节组成,前四个字节分别是图像渲染区域的宽高.GIF的数据是依照大端序存储的,0x0A00为10,所以这个GIF的宽高均为10.
全局色彩列表
由前面的逻辑屏幕描述符可知,全局颜色列表的大小是16,每个颜色占三个字节,依照RGB排列,所以它占有48个字节.数据流中,颜色是依照列表中的索引存储的. GIF中扩展块都以0x21开始,后一个字节是扩展标签,标识扩展用途. 图形节制扩展
图形控制扩展块属于”89a”版本的定义.它在一个图像数据块的最前端,用来指定图像的透明度与动画属性.图形控制扩展的开端两字节是0x21F9,其中0x21表示这是一个扩展,F9表示扩展用于图形控制.第三个字节是块大小(它到结束符之间的数据).第四个字节是压缩字段,前三个Bit保存,四到六Bit是disposal method.第四、五个字节是图像控制扩展后面的图像的动画时间,以无符号整型存储.第六个字节是透明色索引,之后是块结束符0x00. 图像描写符
图像描述符位于GIF中每一个图像数据的前端,由0x2C开始,长度为10个字节.第一个字节是图像描述符的标识0x2c,后面八个字节表现图像的frame(left,top,width,height),用来在动画中局部更新图像.最后一个是压缩字节,主要是关于局部颜色列表的信息,其中第二个Bit表现图像的存储方式是交织还是连续. 局部颜色列表
GIF的图像数据是经过LZW压缩的二进制流,通过解码可以将其依照颜色列表中的颜色进行像素填充.第一个字节是LZW最小编码大小,用来进行数据解码.第二个字节是图像数据的大小,之后的都是图像数据,直到块结束符.
GIF的动画原理GIF动画的循环次数是由应用扩展来控制的,而GIF动画每一帧的过渡方式是由图形控制扩展控制,图像描述符控制图像绘制的区域. disposal method
解码器不会清算画布,直接将下一幅图像渲染上一幅图像上.
解码器会以配景色清理画布,然后渲染下一幅图像.配景色在逻辑屏幕描述符中设置.
解码器会将画布设置为上之前的状态,然后衬着下一幅图像.
保存值 user input flag delay time transparency color 图像渲染区域 实验依据上面的知识,将第一帧的图形控制扩展改为:
这里将透明色改成了赤色(赤色在全局颜色列表中的索引是9),并将 本文永远更新链接地址:http://www.linuxidc.com/Linux/2017-06/145156.htm 更多LINUX教程,尽在编程之家PHP学院专栏。欢迎交流《GIF图片原理和储存结构深入解析》! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |