浅谈动图文件格式 - 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里面封装了新的动图格式,但这离成为行业标准还有一定距离。

本文作者:
李霄,陈敏

目录
相关文章
|
Rust 安全 Linux
如何使用Rust进行系统编程?
在 Rust 中,要调用系统调用并与底层 C 函数进行交互,通常会使用 `libc` crate。`libc` 提供了 Rust 到 C 的 FFI(Foreign Function Interface)绑定,允许 Rust 代码调用和使用底层的 C 函数和系统调用。
383 0
|
2月前
|
人工智能 监控 供应链
51_安全性测试:提示注入与红队
在2025年,大型语言模型(LLM)已成为企业数字化转型的核心驱动力,但随之而来的安全挑战也日益严峻。数据显示,全球每月监测到超过50万次针对大语言模型的越狱攻击,这些攻击利用LLM的"黑箱"特性和自主生成能力,突破了传统安全边界。特斯拉自动驾驶系统因对抗性贴纸导致12%测试场景意外加速、加拿大航空聊天机器人误导票价信息被勒令退款、韩国初创公司因AI数据泄露被罚9.3万美元、谷歌Bard曾因错误信息导致市值缩水1000亿美元等真实案例,都凸显了LLM安全的重要性
|
机器学习/深度学习 人工智能 算法
解密巴黎奥运会中的阿里云AI技术
2024年巴黎奥运会圆满结束,中国代表团金牌数与美国并列第一,展现了卓越实力。阿里云作为官方云服务合作伙伴,通过先进的AI技术深度融入奥运的各项环节,实现了大规模的云上转播,超越传统卫星转播,为全球观众提供流畅、高清的观赛体验。其中,“子弹时间”回放技术在多个场馆的应用,让观众享受到了电影般的多角度精彩瞬间。此外,8K超高清直播、AI智能解说和通义APP等创新,极大地提升了赛事观赏性和互动性。能耗宝(Energy Expert)的部署则助力实现了赛事的可持续发展目标。巴黎奥运会的成功举办标志着体育赛事正式进入AI时代,开启了体育与科技融合的新篇章。
解密巴黎奥运会中的阿里云AI技术
|
11月前
|
前端开发 UED SEO
PM 常见名词(B端)
PM 常见名词(B端)简介 本文档整理了产品经理(PM)在B端产品开发中常用的术语及其释义
311 10
|
11月前
|
开发框架 Java 编译器
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
2025年1月推荐-工欲善其事,必先利其器-程序员必备之-核心基本工具—不要看什么国际排行榜-没有用-编辑器和编译器推荐-优雅草央千澈
564 1
|
IDE Ubuntu 开发工具
2025年vscode (visual studio code)国内高速下载加速镜像,极速秒下!
Visual Studio Code(简称VSCode)是一款由微软开发的轻量级IDE,支持多种操作系统,以其高效、跨平台和免费的特点受到广泛欢迎。针对国内用户下载速度慢的问题,终于有了国内镜像,访问 https://www.baihezi.com/vscode/download
6683 10
2025年vscode (visual studio code)国内高速下载加速镜像,极速秒下!
|
网络协议 算法 网络性能优化
pywinauto教程
pywinauto教程
330 1
|
数据采集 分布式计算 数据可视化
阿里云大数据ACA及ACP复习题(131~140)
本人备考阿里云大数据考试时自行收集准备的题库,纯手工整理的,能够覆盖到今年7月份,应该是目前最新的,发成文章希望大家能一起学习,不要花冤枉钱去买题库背了,也希望大家能够顺利通关ACA和ACP考试。
|
缓存 供应链 Ubuntu
Ubuntu升级软件包及注意事项
Ubuntu是一个常见的Linux发行版,升级软件包是保持系统安全性和性能的重要步骤之一。 在升级软件包之前,务必备份系统上的重要数据。尽管升级通常不会影响用户数据,但为了安全起见,备份是必要的。升级软件包需要下载更新,因此确保你的计算机连接到稳定的网络,以防止下载中断或出现问题。
645 0