什么是 GIF 文件?
GIF 或图形交换格式是一种高度压缩的图像。 GIF 由 Unisys 拥有,使用不会降低图像质量的 LZW 压缩算法。对于每个图像,GIF 通常允许每个像素最多 8 位,并且整个图像最多允许 256 种颜色。与 JPEG 图像相比,它可以显示多达 1600 万种颜色,并且相当接近人眼的极限。早在互联网出现时,GIF 仍然是最佳选择,因为它们需要低带宽并且与消耗纯色区域的图形兼容。动画 GIF 将大量图像或帧组合到一个文件中,并按顺序显示它们以生成动画剪辑或短视频。每帧的颜色限制最多为 256,并且可能最不适合再现具有颜色渐变的其他图像和照片。
GIF 文件格式
从概念上讲,GIF 文件有一个固定大小的图形区域,由零个或多个图像填充。一些 GIF 文件将固定大小的图形区域或块划分为子图像,这些子图像能够在动画 GIF 的情况下用作动画帧。 GIF 格式使用 1 到 8 位的像素深度来存储位图数据。 RGB 颜色模型和调色板数据始终用于存储图像。根据版本,固定长度的标题(“GIF87a"或“GIF89a")定义了典型 GIF 文件的开头。
目前,GIF 有两个版本:87a 和 89a。前者是原始的 GIF 格式,而后者是新的 GIF 格式。在这种文件格式中,块的特征和像素尺寸在固定长度的逻辑屏幕描述符中被提及。全局颜色表的存在和大小可以由屏幕描述符指定,如果存在则跟踪进一步的细节。尾部是文件的最后一个字节,它包含一个 ASCII 分号的单个字节。典型的 GIF87a 文件布局如下:
标题###
Header 包含六个字节,用于将文件类型指定为 GIF。虽然逻辑屏幕描述符与实际标题是分开的,但有时它被视为第二个标题。用于存储标题的相同结构可以存储逻辑屏幕描述符。所有 GIF 文件都以 3 字节签名开头,并使用字符“GIF"作为标识符。版本也是三个字节大小,并声明了 GIF 文件的版本。
逻辑屏幕描述符###
固定长度的图像描述符指定创建 GIF 图像所需的屏幕和颜色信息。高度和宽度字段包含屏幕分辨率的最小值,必须显示图像数据。如果显示设备无法显示指定的分辨率,则需要缩放以适当显示图像。屏幕和颜色映射信息由下表的四个子字段显示(而位 0 是最低有效位):
位 | 子字段 |
---|---|
0-2 | 全局颜色表的大小 |
3 | 色表排序标志 |
4-6 | 彩色分辨率 |
7 | 全局颜色表标志 |
全局颜色表####
一个可选的全局颜色表被放置在逻辑屏幕描述符之后。此表映射以索引图像数据内的像素颜色数据。在没有全局颜色表的情况下,GIF 文件中的每个图像都使用其本地颜色。如果缺少全局和局部颜色表,最好提供默认颜色表。一系列三字节三元组组成了颜色表的元素。每个字节表征一个 RGB 颜色值。红色、绿色和蓝色用作每个颜色表元素的值。全局颜色表中的条目最多可达到 256 个条目,并且始终以 2 的幂表示。
图像数据####
图像数据存储一个字节的未编码符号,后跟子链表以及 LZW 编码数据。
#### 预告片 ####
Trailer 表示文件中最后一个字符的单字节数据。该字节的值永久为 3Bh,并指定数据流的结束。每个 GIF 文件的最后都必须有预告片。