浅谈动图文件格式 - GIF

简介: 介绍动图的文件格式,及其优劣

简介

GIF的全称是Graphics Interchange Format,可译为图形交换格式,用于以超文本标志语言(Hypertext Markup Language)方式显示索引彩色图像,在因特网和其他在线服务系统上得到广泛应用。GIF虽然是一个古老的文件格式,但是随着移动互联网的发展,在手机社交应用中因表情包和动图的火爆而重新大范围的进入公众视野, 重新流行起来。

版本

GIF具有GIF87a和GIF89a两个版本。
GIF87a版本是1987年推出的,一个文件存储一个图像,严格不支持透明像素;GIF87a采用LZW压缩算法,它能够在保持图像质量的前提下将图像尺寸压缩百分之二十到二十五。
GIF89a版本是1989年推出的很有特色的版本,该版本允许一个文件存储多个图像,可实现动画功能,允许某些像素透明。在这个版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程序编程接口4个区块,并提供了对透明色和多帧动画的支持。

文件格式详解

一个典型的GIF文件,由以下内容构成:

  • Q:这是什么文件?A:GIF (Header)
  • Q:显示它需要多大的区域?A:宽xxx,高xxx(LSD)
  • Q:显示它需要准备哪些色彩?A:色表(LSD、GCT、ID、LCT)
  • Q:某一帧的内容是什么样的?A:LZW压缩后的像素列表
  • Q:如何绘制?A:位置、尺寸、透明色、隔行扫描(GCE、ID)
  • Q:绘制完一帧后还要做什么?A:Disposal Method(GCE)
  • Q:开始绘制下一帧前等待多久?A:0.01秒的倍数(GCE)
  • Q:循环播放几次?A:无限,或者1~65535次(NETSCAPE2.0)

image.png

Header

前三个字节叫做“文件签名”,固定为'G' 'I' 'F'
后三个字节标记GIF规范的版本,有"89a"和"87a"两种

image.png

Logical Screen Descriptor(LSD)

包含以下信息:

  • 整个文件的尺寸
  • 是否有全局色表
  • 全局色表的颜色分辨率
  • 色表是否经过了排序
  • 全局色表中颜色的数量
  • 哪种颜色被视为背景色
  • 像素的长宽比
    image.png

色表

很多古老的显示设备并不能直接展示RGB数据, 由于硬件的限制,设备会预先将一些颜色加载到内部寄存器中, 每种颜色对应一个编号,传输图像时,不必传输每一个像素的颜色,而只需要传输每一个像素的颜色编号。

假定色表中最多含有256项
我们需要利用一些算法,提取出最能代表一张图片的256种颜色,配合抖动算法,让色表绘制出的图片尽量接近原图

image.png
原图色彩信息太丰富,会导致难以还原,这就是为什么我们很多时候看到的GIF图片,看起来像是信息缺失或失真的原因。
image.png

色表信息 - 颜色分辨率

颜色分辨率表示原图中一个色彩通道的位数,例如,对于RGB444格式的原图,颜色分辨率为4,RGB888格式的原图,颜色分辨率为8。
LSD中,颜色分辨率用3位​表示,将这个值+1可以得到实际的颜色分辨率数值, 例如,011代表颜色分辨率为4,111代表颜色分辨率为8
image.png

色表信息 - 色表大小

色表大小表示色表中含有的项目数量,用3位表示,记为n,则实际的项目数量为2(n+1),例如,010代表8,100代表32, 111代表色表大小的上限,即256
image.png

色表的格式

每一项含有RGB三个通道的值, 按照编号顺序排列
image.png

全局色表与本地色表

除了GCT之外,每一帧还可以有自己的色表, 本地色表存在时,忽略全局色表
image.png

Image Descriptor

描述如何绘制一帧图片, 一帧不需要占满整张图片, 图片可能是隔行扫描的
image.png

Graphics Control Extension(GCE)

Graphics Control Extension(GCE)是在GIF89a中加入的,属于可选内容,它含有一些动画相关的属性(包括透明色)
image.png

LZW(Lempel–Ziv–Welch)编码

LZW(Lempel–Ziv–Welch)编码由Abraham Lempel、Jacob Ziv和Terry Welch发明, 用于信息的无损压缩,它于1984年被提出,用固定长度的码,表示不同长度的字符串。

GIF中的压缩算法采用的是该LZW的一个变体。

LZW中,字典是不固定的,开始编解码前,会有一个初始字典,编解码时,随着数据的增多,字典也在不断扩充,读入的每一个此前未见过的新字符串,都会被加入到字典中

如编码过程:

  • 字符串:aabcaac
  • 初始字典:#1->a,#2->b,#3->c
  • 见到aa,是我们没见过的字符串,在字典中增加#4->aa,输出1
  • 见到ab,在字典中增加#5->ab,输出1
  • 见到bc,增加#6->bc,输出2
  • 见到ca,增加#7->ca,输出3;见到aac,增加#8->aac,输出4
  • 最后见到c,输出3
  • 得到112343
  • 它对应的解码过程如下:
  • LZW串:112343
  • 初始字典:#1->a,#2->b,#3->c
  • 见到11,输出aa,并在字典中增加#4->aa
  • 见到23,输出bc,增加#5->ab和#6->bc
  • 见到43,输出aac,增加#7->ca和#8->aac
  • 得到aabcaac

在GIF中,图像数据的内容是每个像素的颜色编号串,初始字典就是颜色编号对应同值的字典编号,另外加入两个码:Clear Code和End Of Information Code
以4色图片为例,初始字典为:#1->1,#2->2,#3->3,#4->4,#5->Clear Code(遇到此Code时,清空字典重新开始
),#6->EOI code(图片结束)

图像数据如下图所示,开头是初始字典(除去特殊Code)的位数,接着是数据块的字节数,接着是LZW数据块,以00结尾:

image.png

Disposal method

绘制完一帧之后,如何处理
0:未定义(可以清空)
1:不处理
2:在本帧绘制的区域填上背景色
3:将本帧绘制的区域还原到绘制之前的状态

GIF文件格式的优劣

GIF是一个古老但流行的文件格式,这就概况了GIF这个文件格式的优劣,其优势在于推出时间早,广泛流行,几乎所有的操作系统和浏览器都有对GIF的很好的支持,基于浏览器对于该文件格式的解释,GIF具备加载即播放,同屏多播放等特性,这些都是与同类动态画面的文件(如短视频)所不一致的。而其缺陷在于它的信息承载比很低,同等文件尺寸下分辨率低,画面质量差,还原度差。
现在有很多互联网公司都在推出新的动图格式如GIFV等,但一个新的格式需要将编解码工作都完成,这就需要既提供文件格式,又需要提供解码环境,虽然已经有一些公司在自己的SDK里面封装了新的动图格式,但这离成为行业标准还有一定距离。

本文作者:
李霄,陈敏

目录
相关文章
|
4月前
|
人工智能 监控 供应链
51_安全性测试:提示注入与红队
在2025年,大型语言模型(LLM)已成为企业数字化转型的核心驱动力,但随之而来的安全挑战也日益严峻。数据显示,全球每月监测到超过50万次针对大语言模型的越狱攻击,这些攻击利用LLM的"黑箱"特性和自主生成能力,突破了传统安全边界。特斯拉自动驾驶系统因对抗性贴纸导致12%测试场景意外加速、加拿大航空聊天机器人误导票价信息被勒令退款、韩国初创公司因AI数据泄露被罚9.3万美元、谷歌Bard曾因错误信息导致市值缩水1000亿美元等真实案例,都凸显了LLM安全的重要性
|
Rust 安全 Linux
如何使用Rust进行系统编程?
在 Rust 中,要调用系统调用并与底层 C 函数进行交互,通常会使用 `libc` crate。`libc` 提供了 Rust 到 C 的 FFI(Foreign Function Interface)绑定,允许 Rust 代码调用和使用底层的 C 函数和系统调用。
452 0
|
编解码 内存技术
四款好用的免费直播编码推流软件
现代生活已经离不开互联网,离不开软件了。 这说法毫不夸张。 比如手机上各种APP眼花缭乱 ,各种行业, 各种功能, 各种Logo, 各种的各种。 没有良好的整理力,是真 的不好意思让别人看到啊。 这些功能各异的APP程序大多数是免费APP。
7879 0
|
IDE Ubuntu 开发工具
2025年vscode (visual studio code)国内高速下载加速镜像,极速秒下!
Visual Studio Code(简称VSCode)是一款由微软开发的轻量级IDE,支持多种操作系统,以其高效、跨平台和免费的特点受到广泛欢迎。针对国内用户下载速度慢的问题,终于有了国内镜像,访问 https://www.baihezi.com/vscode/download
8409 10
2025年vscode (visual studio code)国内高速下载加速镜像,极速秒下!
|
JavaScript 前端开发 Android开发
Flutter笔记:关于WebView插件的用法(下)
Flutter笔记:关于WebView插件的用法(下)
1219 5
|
安全 网络协议 云计算
Docker容器网络配置详解
【7月更文挑战第16天】Docker的网络配置是实现容器间以及容器与外部网络通信的基础。通过选择合适的网络模式和配置选项,可以构建高效、安全、可扩展的Docker网络解决方案。
1803 3
|
vr&ar 图形学 UED
优化图形渲染与物理模拟:减少Draw Calls与利用LOD技术提升性能
【7月更文第10天】在现代游戏开发和实时渲染应用中,性能优化是至关重要的环节,它直接关系到用户体验的流畅度和真实感。本文将深入探讨两种关键技术手段——减少Draw Calls和使用Level of Detail (LOD) 技术,来提升图形渲染与物理模拟的效率。
1009 2
|
机器学习/深度学习 机器人
用MoE横扫99个子任务!浙大等提出全新通用机器人策略GeRM
【4月更文挑战第28天】浙江大学等研究团队提出的通用机器人模型GeRM,基于Transformer和Mixture-of-Experts(MoE)架构,能有效处理多种任务。通过离线强化学习,GeRM在99个子任务中展现出优越性能,优于单一专家网络策略,且具备高训练和推理效率。尽管需更多计算资源,但GeRM为多任务机器人技术带来了新突破,有望推动领域发展。[链接:https://arxiv.org/abs/2403.13358]
323 2
|
缓存 前端开发 Java
是什么让一段20行代码的性能提升了10倍
性能优化显而易见的好处是能够节约机器资源。如果一个有2000台服务器的应用,整体性能提升了10%,理论上来说,就相当于节省了200台的机器。除了节省机器资源外,性能好的应用相对于性能差的应用,在应对流量突增时更不容易达到机器的性能瓶颈,在同样流量场景下进行机器扩容时,也只需要更少的机器,从而能够更快的完成扩容、应急操作。所以,性能好的应用相对于性能差的应用在稳定性方面也更胜一筹。
是什么让一段20行代码的性能提升了10倍