gif的文件格式?
谁能告诉我gif文件具体的格式是什么?
谢谢
参考文章:
留个伊妹儿我发给你
1.概述
~~~~~~~~
gif(graphics interchange format,图形交换格式)文件是由 compuserve公司
开发的图形文件格式,版权所有,任何商业目的使用均须 compuserve公司授权。
gif图象是基于颜色列表的,
最多只支持8位。gif文件内部分成许多存储块,用来存储多幅图象或者是决
定图象表现行为的控制块,用以实现动画和交互式应用。gif文件还通过lzw压缩算法
压缩图象数据来减少图象尺寸。
2.gif文件存储结构
~~~~~~~~~~~~~~~~~~~
gif文件内部是按块划分的,包括控制块和数据块
两种。控制块是控制数据块行为的,根据不同的控制块包含一些
不同的控制参数;数据块只包含一些8-bit的字符流,由它前面的控制块来决定它的功
能,每个数据块大小从0到255个字节,数据块的第一个字节指出这个数据块大小,
计算数据块的大小时不包括这个字节,所以一个空的数据块有一个字节,那就是数据块的
大小0x00。下表是一个数据块的结构:
byte
7
6
5
4
3
2
1
0
bit
块大小
block size - 块大小,不包括这个这个字节
data values - 块数据,8-bit的字符串
...
254
255
一个gif文件的结构可分为文件头(file header)、gif数据流(gif data stream)和
文件终结器(trailer)三个部分。文件头包含gif文件署名(signature)和版本号(version);
gif数据流由控制标识符、图象块(image block)和其他的一些扩展块组成;文件终结器只
有一个值为0x3b的字符表示文件结束。下表显示了一个gif文件的组成结构:
gif署名
文件头
版本号
逻辑屏幕标识符
gif数据流
全局颜色列表
...
图象标识符
图象块
图象局部颜色列表图
基于颜色列表的图象数据
...
gif结尾
文件结尾
下面就具体介绍各个部分:
文件头部分(header)
~~~~~~~~~~~~~~~~~
gif署名(signature)和版本号(version)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
gif署名用来确认一个文件是否是gif格式的文件,这一部分由三个字符组成:
"gif";文件版本号也是由三个字节组成,可以为"87a"或"89a".具体描述见下表:
byte
7
6
5
4
3
2
1
0
bit
g
gif文件标识
i
f
8
gif文件版本号:87a - 1987年5月
89a - 1989年7月
7或9
a
gif数据流部分(gif data stream)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
逻辑屏幕标识符(logical screen descriptor)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这一部分由7个字节组成,定义了gif图象的大小(logical screen width & height)、颜
色深度(color bits)、背景色(blackground color index)以及有无全局颜色列表(global
color table)和颜色列表的索引数(index count),具体描述见下表:
byte
7
6
5
4
3
2
1
0
bit
逻辑屏幕宽度
像素数,定义gif图象的宽度
逻辑屏幕高度
像素数,定义gif图象的高度
m
cr
s
pixel
具体描述见下...
背景色
背景颜色(在全局颜色列表中的索引,如果没有全局颜色列表,该值没有意义)
像素宽高比
像素宽高比(pixel aspect radio)
m - 全局颜色列表标志(global color table flag),当置位时表示有全局颜色列表,pixel值有意义.
cr - 颜色深度(color resolution),cr+1确定图象的颜色深度.
s - 分类标志(sort flag),如果置位表示全局颜色列表分类排列.
pixel - 全局颜色列表大小,pixel+1确定颜色列表的索引数.
全局颜色列表(global color table)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
全局颜色列表必须紧跟在逻辑屏幕标识符后面,每个颜色列表索引条目由三个字节组成,
按r、g、b的顺序排列。
byte
7
6
5
4
3
2
1
0
bit
索引1的红色值
索引1的绿色值
索引1的蓝色值
索引2的红色值
索引2的绿色值
索引2的蓝色值
...
图象标识符(image descriptor)
~~~~~~~~~~~~~~~~~~~~~~~~~
一个gif文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,
图象标识符以0x2c(,)字符开始,定义紧接着它的图象的性质,包括图象相对于逻
辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成:
byte
7
6
5
4
3
2
1
0
bit
0
0
1
0
1
1
0
0
图象标识符开始,固定值为,
x方向偏移量
必须限定在逻辑屏幕尺寸范围内
y方向偏移量
图象宽度
图象高度
10
m
i
s
r
pixel
m - 局部颜色列表标志(local color table flag)
置位时标识紧接在图象标识符之后有一个局部颜色列表,供紧跟在它之后的一幅图
象使用;值否时使用全局颜色列表,忽略pixel值。
i - 交织标志(interlace flag),置位时图象数据使用交织方式排列,
否则使用顺序排列。
s - 分类标志(sort flag),如果置位表示紧跟着的局部颜色列表分类排列.
r - 保留,必须初始化为0.
pixel - 局部颜色列表大小(size of local color table),pixel+1就为颜色列表的位数
局部颜色列表(local color table)
~~~~~~~~~~~~~~~~~~~~~~~~~~
如果上面的局部颜色列表标志置位的话,则需要在这里定义
一个局部颜色列表以供紧接着它的图象使用,注意使用前应线保存原来的颜色列表,使
用结束之后回复原来保存的全局颜色列表。如果一个gif文件即没有提供全局颜色列表,
也没有提供局部颜色列表,可以自己创建一个颜色列表,或使用系统的颜色列表。局部
颜色列表的排列方式和全局颜色列表一样:rgbrgb......
基于颜色列表的图象数据(table-based image data)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
由两部分组成:lzw编码长度(lzw minimum code size)和图象数据(image data)。
byte
7
6
5
4
3
2
1
0
bit
lzw编码长度
lzw编码初始码表大小的位数,详细描述见lzw编码...
...
图象数据,由一个或几个数据块(data sub-blocks)组成
数据块
...
gif图象数据使用了lzw压缩算法,
大大减小了图象数据的大小。图象数据在压缩前有两种排列格式:连续的和交织的(由
图象标识符的交织标志控制)。连续方式按从左到右、从上到下的顺序排列图象的光栅
数据;交织图象按下面的方法处理光栅数据:
创建四个通道(pass)保存数据,每个通道提取不同行的数据:
第一通道(pass 1)提取从第0行开始每隔8行的数据;
第二通道(pass 2)提取从第4行开始每隔8行的数据;
第三通道(pass 3)提取从第2行开始每隔4行的数据;
第四通道(pass 4)提取从第1行开始每隔2行的数据;
下面的例子演示了提取交织图象数据的顺序:
行
通道1
通道2
通道3
通道4
0 --------------------------------------------------------
1
1 --------------------------------------------------------
4
2 --------------------------------------------------------
3
3 --------------------------------------------------------
4
4 --------------------------------------------------------
2
5 --------------------------------------------------------
4
6 --------------------------------------------------------
3
7 --------------------------------------------------------
4
8 --------------------------------------------------------
1
9 --------------------------------------------------------
4
10 --------------------------------------------------------
3
11 --------------------------------------------------------
4
12 --------------------------------------------------------
2
13 --------------------------------------------------------
4
14 --------------------------------------------------------
3
15 --------------------------------------------------------
4
16 --------------------------------------------------------
1
17 --------------------------------------------------------
4
18 --------------------------------------------------------
3
19 --------------------------------------------------------
4
20 --------------------------------------------------------
2