这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
Gif简介
GIF格式的名称是Graphics Interchange Format的缩写,是在1987年由Compu Serve公司为了填补跨平台图像格式的空白而发展起来的。GIF可以被PC和Mactiontosh等多种平台上被支持。
- 位图,由许多的像素组成,像素综合起来就构成了图片。
- 采用的是Lempel-Zev-Welch(LZW)压缩算法,最高支持256种颜色。
- 自带一个调色板,里面存放需要用到的各种颜色。
- 有GIF87a和GIF89a两个版本。
Gif文件结构
文件头
文件头包含:格式声明、逻辑屏幕描述块、全局调色盘
格式声明
- Signature 为“GIF”3 个字符。
- Version 为“87a”或“89a”3 个字符。
逻辑屏幕描述块
- Logical Screen存储像素单位的宽高信息。
- Packet存储调色盘信息。
- Background color Index 定义了图像透明区域的背景色在调色盘里的索引。
- Pixel Aspect Ratio 定义了像素宽高比,一般为0。
Packet调色盘信息
- Global Color Table Flag为全局颜色表标志,为1表示全局有定义。
- Color Resolution代表颜色表中每种基色位长(需要+1),为111时,每个颜色用8bit表示。
- Sort Flag 表示是否对颜色表里的颜色进行优先度排序,把常用的排在前面。
- Global Color Table 表示颜色表的长度,计算规则是值+1作为2的幂,得到的数字就是颜色表的项数,取最大值111时,项数=256,也就是说GIF格式最多支持256色的位图,再乘以Color Resolution算出的字节数,就是调色盘的总长度。
全局调色盘
gif有公共调色盘信息,存储gif每个像素点所支持显示的色值。图片每个像素点只需要存储调色盘的索引值,在显示时通过索引找到对应显示的色值。Gif格式允许两种调色盘同时存在,在没有局部调色盘的情况下就使用公共调色盘来渲染。
图像数据区
Application Extension
这是提供给应用程序自己使用的(需要89a版本),应用程序可以在这里定义自己的标识、信息等。
Graphic Control Extension
此为可选的(需要89a版本),可以放在一个图像块(图像标识符)或文本扩展块的前面,用来控制跟在它后面的第一个图像(或文本)的渲染(Render)形式。
Image Extension
图像标识符便是具体的图像数据开始的位置。每一个标识符的开头同样描述了图片的宽高等信息,紧接着是局部的颜色列表,局部颜色列表之后的便是图像的压缩数据。GIF图像数据使用了LZW压缩算法,大大减小了图像数据的大小。图像数据在压缩前有两种排列格式:连续的和交织的(由图像标识符的交织标志控制)。连续方式按从左到右、从上到下的顺序排列图像的光栅数据。
结束标志区
图像结尾用一个固定的字节0x3B来表示。
分析工具
Gifsicle工具分析
Gifsicle是用于创建,编辑和获取有关GIF图像和动画的信息的命令行工具。使用gifsicle制作GIF动画很容易
安装Gifsicle
npm --registry https://registry.npm.taobao.org install --global gifsicle
复制代码
ImageMagick工具分析
brew install imagemagick
复制代码
二进制查看工具Synalyze
一款Mac环境的二进制查看工具,对于分析Gif图片或是其他格式文件有帮助。
Gif压缩策略
图片尺寸压缩
对Gif每帧图像大小进行压缩,比如原先1080×720全局尺寸压缩到108×72。但压缩效率可能不高。
抽帧减少帧数
截取Gif中几个关键帧,减少Gif总图片数来压缩Gif大小。但缺点可能会让动画变得不连贯。
控制调色盘长度
Gif图片最多包含256个RGB值,动态Gif每帧之间信息差异不大颜色会有重复使用的情况。在存储时,我们用一个公共的索引表,把图片中用到的颜色提取出来,组成一个调色盘,这样,在存储真正的图片点阵时,只需要存储每个点在调色盘里的索引值。
如果改变Gif包含的总色值数则就是压缩调色盘的大小也就是对Gif大小做了压缩。