Gif格式简要介绍
Gif格式标准主要有87a和89a两个版本。
Gif由一个个的block组成,按照我的理解可以将Gif图数据分为两个部分,一个部分为头部,包含了Header(Gif的识别),Logical Screen Descriptor(描述Gif图展示的逻辑屏幕的参数),Global Color Table(全局的调色板,这个为可选)。之后就是数据主体部分,可以是图像的数据以及各种扩展块。
介绍分为两个部分,一个部分是Gif中比较通用的一些数据组织形式介绍,一个部分是Gif图的数据块的介绍。
一下如果没有特殊说明,就是87a标准中就有的,有特殊说明,为89a标准中才出现的,主要为各种扩展块。
通用的数据组织形式
Data Sub-blocks 数据子块
数据子块是包含数据的单元,它们没有一个标签(label)。无论在何种格式中指定数据块,这些块在控制块的上下文中进行处理。数据子块的第一个字节标识了跟随的数据字节的数量,一个数据子块能够包含0到255数据字节,块的大小并不包含指定大小的字节本身。空的子块指定大小的字节包含着0x00。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Block Size Byte
+---------------+
1 | |
+- -+
2 | |
+- -+
3 | |
+- -+
| | Data Values Byte
+- -+
up | |
+- . . . . -+
to | |
+- -+
| |
+- -+
255 | |
+---------------+
Block Terminator 块的终结标识
这个数据子块用来终结一系列的数据子块,其包含一个单独的字节指示块的大小为0,之后并不包含其它数据。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Block Size Byte
+---------------+
数据块
数据块分为四个部分介绍,第一部分为文件头和紧密跟随着文件头的相关数据块;第二部分为和数据流中图像相关的数据块;第三部分为各种扩展。最后一个部分为文件尾。
Header及Header相关
Header(文件头)
Header标识了文本中的GIF数据流,Signature字段标记了数据流的开始,Header字段是必须的,Header定义如下:
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Signature 3 Bytes
+- -+
1 | |
+- -+
2 | |
+---------------+
3 | | Version 3 Bytes
+- -+
4 | |
+- -+
5 | |
+---------------+
依次为
- 3 Bytes Signature: “GIF”三个字节
- 3 Bytes Version: 版本号 “87a” “89a”等
Logical Screen Descriptor
Logical Screen Descriptor包含了描述了在设备上呈现图像区域所需的参数。Logical Screen Descriptor字段是必须的,并且必须紧跟在Header后面。Logical Screen Descriptor定义了依次为:
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Logical Screen Width Unsigned
+- -+
1 | |
+---------------+
2 | | Logical Screen Height Unsigned
+- -+
3 | |
+---------------+
4 | | | | | <Packed Fields> See below
+---------------+
5 | | Background Color Index Byte
+---------------+
6 | | Pixel Aspect Ratio Byte
+---------------+
- Unsigned(2字节) Logical Screen Width 宽度,单位为像素
- Unsigned(2字节) Logical Screen Height 高度,单位为像素
- Packed Fields(1字节)
- 1 Bit Global Color Table Flag
- 3 Bits Color Resolution
- 1 Bit Sort Flag
- 3 Bits Size of Global Color Table
- 1 Byte Background Color Index
- 1 Byte Pixel Aspect Ratio
描述一下一些字段的意思:
- Global Color Table Flag 描述是否存在Global Color Table的标识,值分别为
- 0 - 不会在Logical Screen Descriptor后面跟随着Global Color Table, Background Color Index字段也就没有意义
- 1 - 在Logical Screen Descriptor后面跟随着Global Color Table,Background Color Index也就有意义
- Color Resolution:数值为原始图像的原色的位数减去1。这个值代表了整个调色板的大小,并不是图像中实际使用的颜色数量。例如若这个值为3,代表原始图像的调色盘每个原色有4位。
- Sort Flag 标识Global Color Table是否根据重要性递减被排序过了,数值分别为
- 0 - 没有排序过
- 1 - 递减排序,最重要的颜色优先
- Size of Global Color Table:如果Global Color Table Flag为1,这个字段的值用来统计Global Color Bytes中的byte数。即使没有指定全局颜色表,根据上述公式设置此字段,以便解码器可以选择显示流的最佳图形模式。(该字段由字节的3个最低有效位组成)。
- Background Color Index 背景颜色在Global Color Table中的索引。背景颜色用于被没被图像覆盖的区域的像素。如果Global Color Table Flag是0,这个字段应为0并且被忽视。
- Pixel Aspect Ratio:用于计算原始图像中像素的宽高比的近似值。如果这个字段为0,则根据以下公式计算宽高比的近似值:
Aspect Ratio = (Pixel Aspect Ratio + 15) / 64
Pixel Aspect Ratio:像素的宽和高的商,这个值范围允许以1/64的增量从4:1到1:4
Global Color Table
该块包含一个color table,是一系列的bytes代表红-绿-蓝三原色。Global Color