8月更文挑战|Android基础开发-GIF文件分析

这是我参与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 个字符。

image.png
image.png

逻辑屏幕描述块

  • Logical Screen存储像素单位的宽高信息。
  • Packet存储调色盘信息。
  • Background color Index 定义了图像透明区域的背景色在调色盘里的索引。
  • Pixel Aspect Ratio 定义了像素宽高比,一般为0。

image.png
image.png

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格式允许两种调色盘同时存在,在没有局部调色盘的情况下就使用公共调色盘来渲染。

image.png

图像数据区

Application Extension

这是提供给应用程序自己使用的(需要89a版本),应用程序可以在这里定义自己的标识、信息等。

image.png

Graphic Control Extension

此为可选的(需要89a版本),可以放在一个图像块(图像标识符)或文本扩展块的前面,用来控制跟在它后面的第一个图像(或文本)的渲染(Render)形式。
image.png

Image Extension

图像标识符便是具体的图像数据开始的位置。每一个标识符的开头同样描述了图片的宽高等信息,紧接着是局部的颜色列表,局部颜色列表之后的便是图像的压缩数据。GIF图像数据使用了LZW压缩算法,大大减小了图像数据的大小。图像数据在压缩前有两种排列格式:连续的和交织的(由图像标识符的交织标志控制)。连续方式按从左到右、从上到下的顺序排列图像的光栅数据。

image.png

结束标志区

图像结尾用一个固定的字节0x3B来表示。

image.png

分析工具

Gifsicle工具分析

Gifsicle是用于创建,编辑和获取有关GIF图像和动画的信息的命令行工具。使用gifsicle制作GIF动画很容易

安装Gifsicle

npm --registry https://registry.npm.taobao.org install  --global gifsicle
复制代码

ImageMagick工具分析

brew install imagemagick
复制代码

二进制查看工具Synalyze

一款Mac环境的二进制查看工具,对于分析Gif图片或是其他格式文件有帮助。

image.png

Gif压缩策略

图片尺寸压缩

对Gif每帧图像大小进行压缩,比如原先1080×720全局尺寸压缩到108×72。但压缩效率可能不高。

抽帧减少帧数

截取Gif中几个关键帧,减少Gif总图片数来压缩Gif大小。但缺点可能会让动画变得不连贯。

控制调色盘长度

Gif图片最多包含256个RGB值,动态Gif每帧之间信息差异不大颜色会有重复使用的情况。在存储时,我们用一个公共的索引表,把图片中用到的颜色提取出来,组成一个调色盘,这样,在存储真正的图片点阵时,只需要存储每个点在调色盘里的索引值。

如果改变Gif包含的总色值数则就是压缩调色盘的大小也就是对Gif大小做了压缩。

参考

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享