gif原理+gifsicle压缩gif
一 gif原理
简单来说,gif就是通过一张张静态图片连续播放产生的。
实验图片为
gif信息包含: 1.文件头、2.图像帧信息、3.注释。
1 文件头(格式声明、逻辑屏幕描述符、全局调色盘)
1 .1格式声明
一般先声明是gif文件,然后再加上版本号。
通过命令行vim查看gif文件,可以看到文件开头为GIF,89a表示格式,格式有87a或者89a。
在命令行中输入hexdump xx.gif可以看到gif的16进制文件,对照ASCII码,474946代表GIF,383961代表89a。
1.2 逻辑屏幕描述符
紧跟在文件头后,固定有7个字节,表明图片需要占用的空间,包括图片宽Width(2字节)、高Depth(2B),调色盘信息Packet(1B),背景色索引(1B),像素高宽比(1B)
通过gifsicle -I xx.gif查看图片信息(需提前下载安装gifsicle)
(1)宽、高
十六进制的f8表示十进制的248,73表示十进制的115
(2)调色盘信息
十六进制f5表示二进制的1111 0101 ,以下从最高位开始描述
1)全局颜色表标志global color table flag(1bit),若为0,表示没有全局颜色表示表,若为1,后面则会跟上全局颜色表,示例图片为1;
2)颜色分辨率color resolution(3bit),代表每个像素点的颜色由多少位表示,000为无效,001表示2bits/pixel(即黑白图片),111表示8bits/pixel。
3)排序标志sort flag(1bit),表示是否按照优先顺序排序,把常用的颜色放到前面,主要是为适应早期颜色度低的时期,目前较少使用,但仍保存该位。
4)颜色表长度Global Color Table(3bit),2^(N+1)为颜色表项数,101表示2^6=项,表示最多支持64色的位图。
可在gifsicle -I信息中查看到Global Color Table的值
调色盘总长度 = 颜色表长度 * 3,这里调色盘总长度为64*3=192,相当于64种颜色,RGB表示颜色,每种占3字节。
(3)背景色索引、像素高宽比
背景色索引表示图片的背景颜色。看两篇参考链接,貌似现在没有太多作用了。
1.3 全局调色盘
颜色表长度为64,代表全局调色盘占64个颜色,用gifsicle --cinfo xx.gif可以查看颜色表信息
若调色盘信息中的全局颜色表标志为1,则在十六进制文件中,逻辑屏幕描述符后紧跟着全局调色盘数据,否则不存在全局调色盘数据。
gifsicle使用--colors参数可以对颜色参数表进行修改,可以发现只有2^2种颜色了。
2 图像帧信息
89a标准下新增了帧数据扩展,
(1)程序扩展结构、(2)注释扩展结构 、(3)图形控制扩展、(4)平滑文本扩展结构
四种扩展均以21打头,程序扩展结构为21 ff、注释扩展结构21 fe 、(3)图形控制扩展21 f9、(4)平滑文本扩展结构21 01
二 gifsicle压缩gif∫
参考链接:
https://www.cnblogs.com/qcloud1001/p/6647080.html
https://www.jianshu.com/p/df52f1511cf8
https://qastack.cn/graphicdesign/20908/how-to-remove-every-second-frame-from-an-animated-gif