GIF格式详解.docx
- 文档编号:26267299
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:25
- 大小:26.44KB
GIF格式详解.docx
《GIF格式详解.docx》由会员分享,可在线阅读,更多相关《GIF格式详解.docx(25页珍藏版)》请在冰豆网上搜索。
GIF格式详解
5.3GIF格式
GIF(GraphicsInterchangeFormat)的原义是“图像互换格式”,是CompuServe公司在1987年开发的图像文件格式。
GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。
其压缩率一般在50%左右,它不属于任何应用程序。
目前几乎所有相关软件都支持它,公共领域有大量的软件在使用GIF图像文件。
GIF图像文件的数据是经过压缩的,而且是采用了可变长度等压缩算法。
GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。
从整体结构上来说,GIF文件由全局信息表、调色板数据、局部信息表和像素数据4部分组成。
全局信息表和局部信息表的长度是固定的,全局信息表的长度恒为13,而局部信息表的长度恒为10字节。
一个GIF文件可能存储着多幅图像,但整个文件只有一个全局信息表而每幅图像则各自拥有一个局部信息表,局部信息表以逗号做前导符,整个文件以分号结尾。
5.3.1GIF文件结构
GIF文件结构的典型结构如表1所示。
为方便下文说明,在构件左边加了编号。
表1GIF文件结构
1
Header
GIF文件头
2
LogicalScreenDescriptor
逻辑屏幕描述块
3
GlobalColorTable
全局彩色表
…扩展模块(任选)…
4
ImageDescriptor
图形描述块
5
LocalColorTable
局部彩色表(可重复n次)
可
6
TableBasedImageData
表式压缩图像数据
重
7
GraphicControlExtension
图像控制扩展块
复
8
PlainTextExtension
无格式文本扩展块
n
9
CommentExtension
注释扩展块
个
10
ApplicationExtension
应用程序扩展块
…扩展模块(任选)…
11
GIFTrailer
GIF文件结束块
按块的特征可以分为三类:
控制块(ControlBlock),图形描绘块(Graphic-RenderingBlock)和专用块(SpecialPurposeBlock)。
1、控制块
控制块包含有用来控制数据流(DataStream)或者设置硬件参数的信息,其成员包括:
●GIF文件头(Header)
●逻辑屏幕描述块(LogicalScreenDescriptor)
●图形控制扩展块(GraphicControlExtension)
●文件结束块(Trailer)
2、图形描绘块
包含有用来描绘在显示设备上显示图形的信息和数据,其成员包括:
●图像描述块(ImageDescriptor)
●无格式文本扩展块(PlainTextExtension)
●全局调色板、局部调色板、图像压缩数据和图像说明扩充块
3、特殊用途数据块
包含有与图像处理无关的信息,其成员包括:
●注释扩展块(CommentExtension)
●应用扩展块(ApplicationExtension)
除了在控制块中的逻辑屏幕描述块(LogicalScreenDescriptor)和全局彩色表(GlobalColorTable)的作用范围是整个数据流(DataStream)之外,所有其他控制块仅控制跟在它们后面的图形描绘块。
5.3.2构件详解
1、GIF文件头
文件头描述块(Header)定义GIF数据流(GIFDataStream),它的结构如图1所示。
文件头描述块(Header)由GIF标记域(Signature)和版本号(Version)域组成,是一个由6个固定字节组成的数据块,它们用来说明使用的文件格式是GIF格式及当前所用的版本号。
GIF标记域(Signature)存放的是“GIF”,版本号域存放的是1987年5月发布的“87a”或者1989年7月发布的“89a”,或者更加新的版本号。
typedefstructgifheader{
BYTEbySignature[3];
BYTEbyVersion[3];
}GIFHEADER;
7
6
5
4
3
2
1
0
字节号
域的名称
数据类型
0
Signature
1
GIF标记
3Bytes
2
3
Version
4
版本号
3Bytes
5
图1标记/版本数据块的结构
2、逻辑屏幕描述块
逻辑屏幕描述块(LogicalScreenDescriptor)包含定义图像显示区域的参数,包括背景颜色信息。
这个数据块中的坐标相对于虚拟屏幕的左上角,不一定是指显示屏的绝对坐标,这就意味可以参照窗口软件环境下的窗口坐标或者打印机坐标来设计图像显示程序。
逻辑屏幕描述块的结构如图2所示:
typedefstructgifscrdesc{
WORDwWidth;
WORDwDepth;
structglobalflag{
BYTEPalBits:
3;
BYTESortFlag:
1;
BYTEColorRes:
3;
BYTEGlobalPal:
1;
} GlobalFlag;
BYTEbyBackground;
BYTEbyAspect;
} GIFSCRDESC;
7
6
5
4
3
2
1
0
字节号
域的名称
类型
LogicalScreenWidth
0
逻辑屏幕宽度
Unsigned
1
(以像素为定单位)
LogicalScreenHeight
2
逻辑屏幕高度
Unsigned
3
(以像素为定单位)
G
CR
S
Size
4
包装域
见图3
BackgroundColorIndex
5
背景颜色索引
Byte
PixelAspectRatio
6
像素宽高比
Byte
图2屏幕描述块的结构
逻辑描述块包含7个字节。
字节0和字节1用来说明逻辑显示屏的宽度,字节3和字节4用来说明逻辑显示屏的高度,字节4用来描述彩色表的属性,字节5用来指定背景颜色索引,字节6用来计算像素的宽高比。
现作如下说明:
1)屏幕描述块中的第5个字节称为包装域(PackedFields),它的位结构如图2所示,它由4个子域组成:
(1)全局彩色表标志(GlobalColorTableFlag)域G用来说明是否有全局彩色表存在。
如果G=1,表示有一个全局彩色表(GlobalColorTable)将紧跟在这个逻辑屏幕描述块(LogicalScreenDescriptor)之后;这个标志也用来选择背景颜色索引(BackgroundColorIndex)。
如果G=1,背景颜色索引(BackgroundColorIndex)域中的值就用作背景颜色的索引。
(2)彩色分辨率(ColorResolution)域CR用来表示原始图像可用的每种基色的位数(实际值减1)。
这个位数表示整个调色板的大小,而不是这幅图像使用的实际的颜色数。
例如,如果该域的值CR=3,说明原始图像可用每个基色有4位的调色板来生成彩色图像。
(3)彩色表排序标志(SortFlag)域S用来表示全局彩色表(GlobalColorTable)中的颜色是否按重要性(或者称使用率)排序。
如果S=0,表示没有重要性排序;如果S=1表示最重要的颜色排在前。
这样做的目的是辅助颜色数比较少的解码器能够选择最好的颜色子集,在这种情况下解码器就可选择彩色表中开始段的彩色来显示图像。
(4)全局彩色表大小(SizeofGlobalColorTable)域Size表示表示每个像素的位数,它用来计算全局彩色表(GlobalColorTable)中包含的字节数。
在全局彩色表标志(GlobalColorTableFlag)域G=0时就不需要计算,G=1时就要计算彩色表的大小,具体计算见下文的“3、全局彩色表”。
7
6
5
4
3
2
1
0
GlobalColorTableFlag
ColorResolution
SortFlag
SizeofGlobalColorTable
图3逻辑屏幕描述块中的包装域结构
2)屏幕描述块中的第6个字节是背景颜色索引(BackgroundColorIndex),它是彩色表的一个索引值,用来指定背景颜色。
如果全局彩色表标志(GlobalColorTableFlag)域G=0,这个域的值也设置为0。
3)像素宽高比(PixelAspectRatio)域中的值是一个因数,是计算原始图像像素的宽高比的一个近似值。
如果该域的值范围为1~255,如果不等于0,宽高比的近似值按下式计算:
AspectRatio=(PixelAspectRatio+15)/64
像素宽高比(PixelAspectRatio)定义成像素的宽度与高度之比,比值的范围在4:
1~1:
4之间,其增量为1/64。
3、全局彩色表
由于一个GIF文件可以包含多幅彩色图像,每幅彩色图像也许都包含适合自身特点的彩色表,所以一个GIF文件可以有好几个彩色表。
但归纳起来只有两类:
全局彩色表(GlobalColorTable)或局部彩色表(LocalColorTable)。
全局彩色表可用于图像本身没有带彩色表的所有图像和无格式文本扩展块(PlainTextExtension),而局部彩色表只用于紧跟在它后面的一幅图像。
在处理全局彩色表和局部彩色表时需要注意下面一些规则。
(1)如果GIF文件包含全局彩色表(GlobalColorTable),而且要显示的图像本身又带有局部彩色表,那末显示该幅彩色图像时就用它自己的彩色表,而不用全局彩色表。
在这种情况下,解码器就首先保存全局彩色表(GlobalColorTable),然后使用局部彩色表(LocalColorTable)来显示图像,最后再回复全局彩色表(GlobalColorTable)。
(2)全局彩色表(GlobalColorTable)和局部彩色表(LocalColorTable)都是可选择的。
由于这个原因,解码器最好要保存全局彩色表(GlobalColorTable),一直到出现另一个全局彩色表(GlobalColorTable)为止。
这样做之后,对于包含完全没有彩色表的一幅或者多幅彩色图像的GIF文件就可以使用最后保存的全局彩色表(GlobalColorTable)进行处理。
(3)如果同类型的图像能够使用相同的彩色表来显示,编码器就要尽可能使用一个全局彩色表(GlobalColorTable);如果没有彩色表可用,解码器就可以使用计算机系统提供的彩色表或者解码器自身的彩色表。
(4)全局彩色表(GlobalColorTable)存在与否由逻辑屏幕描述块(LogicalScreenDescriptor)中字节5的全局彩色表标志(GlobalColorTableFlag)域G的值确定。
如果存在,彩色表就紧跟在逻辑屏幕描述块(LogicalScreenDescriptor)之后。
彩色表的表项数目等于2(n+1),其中n=b2b1b0,每个表项由三个字节组成,分别有R、G、B的相对强度,因此彩色表的字节数等于3×2(n+1),
彩色的结构如图4所示:
76543210
字节号
域的名称
数据类型
redintensity
0
红色索引000
Byte
greenintensity
1
绿色索引000
Byte
blueintensity
2
蓝色索引000
Byte
redintensity
3
红色索引001
Byte
greenintensity
4
绿色索引001
Byte
blueintensity
5
蓝色索引001
Byte
…
…
…
…
…
…
redintensity
745
红色索引255
Byte
greenintensity
746
绿色索引255
Byte
blueintensity
767
蓝色索引255
Byte
图4彩色表结构
局部彩色表与全局彩色表有相同的存储格式。
4、图像描述块
GIF图像文件格式可包含数量不限的图像,而且也没有一个固定的存放顺序,仅用一个字节的图像分隔符(ImageSeparator)来判断是不是图像描述块。
每一幅图像都由一个图像描述块(ImageDescriptor)、可有可无的局部彩色表(LocalColorTable)和图像数据组成。
每幅图像必须要落在逻辑屏幕描述块(LogicalScreenDescriptor)中定义的逻辑屏(LogicalScreen)尺寸范围里。
图像描述块(ImageDescriptor)之前可以有一个或者多个控制块,例如图形控制扩展块(GraphicControlExtension),其后可以跟着一个局部彩色表(LocalColorTable)。
无论前后是否有各种数据块,图像描述块(ImageDescriptor)总是带有图像数据。
图像描述块(ImageDescriptor)的结构如图5所示。
typedefstructgifimage{
WORDwLeft;
WORDwTop;
WORDwWidth;
WORDwDepth;
structlocalflag{
BYTEPalBits :
3;
BYTEReserved :
2;
BYTESortFlag :
1;
BYTEInterlace:
1;
BYTELocalPal :
1;
} LocalFlag;
} GIFIMAGE;
7
6
5
4
3
2
1
0
字节号
域的名称
类型
ImageSeparator
0
图像分隔符
Byte
ImageLeftPosition
1
图像左边位置
Unsigned
2
(以像素为定单位)
ImageTopPosition
3
图像顶部位置
Unsigned
4
(以像素为定单位)
ImageWidth
5
图像宽度
Unsigned
6
(以像素为定单位)
ImageHeight
7
图像高度
Unsigned
8
(以像素为定单位)
9
包装域
见图6
图5图像描述块的结构
在图5中,图像分隔符(ImageSeparator)用来标识图像描述块的开始,该域包含固定的值:
0x2C;图像左边位置(ImageLeftPosition)是相对于逻辑屏幕(LogicalScreen)最左边的列号,逻辑屏幕最左边的列好定义为0;图像顶部位置(ImageTopPosition)是相对于逻辑屏幕(LogicalScreen)顶部的行号,逻辑屏幕顶部的行号定义为0。
7
6
5
4
3
2
1
0
LocalColorTableFlag
InterlaceFlag
SortFlag
Reserved
SizeofLocalColorTable
图6图像描述块中的包装域结构
图像描述块(ImageDescriptor)中的第9个字节称为包装域(PackedFields)字节,它的位结构如图6所示,它由5个子域组成:
(1)局部彩色表标志(LocalColorTableFlag)域L用来说明是否有局部彩色表存在。
如果L=1,表示有一个局部彩色表(LocalColorTable)将紧跟在这个图像描述块(ImageDescriptor)之后;如果G=0,表示图像描述块(ImageDescriptor)后面没有局部彩色表(LocalColorTable),该图像要使用全局彩色表(GlobalColorTable)。
(2)交插显示标志(InterlaceFlag)域I用来表示该图像是不是交插图像(InterlacedImages)。
如果I=0,表示该图像不是交插图像,如果I=1表示该图像是交插图像。
使用该位标志可知道图像数据是如何存放的。
GIF文件格式定义了两种数据存储方式:
一种是按图像行连续顺序存储,这个顺序与显示器上显示行的顺序相同;另一种按交插方式存储。
交插图像按行分成如下所示的4组(Group):
Group1:
每隔8行组成一组,从第0行开始显示/第1遍交插
Group2:
每隔8行组成一组,从第4行开始显示/第2遍交插
Group3:
每隔4行组成一组,从第2行开始显示/第3遍交插
Group4:
每隔2行组成一组,从第1行开始显示/第4遍交插
由于显示图像需要较长的时间,使用这种方法存放和显示图像数据,人们就可以在图像显示完成之前看到这幅图像的概貌,而不觉得显示时间长。
图8说明了这种交插图像的存储和显示顺序。
行号
像 点
交插遍次
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
图7交插图像显示顺序
(3)彩色表排序标志(SortFlag)域的含义与全局彩色表(GlobalColorTable)中(SortFlag)域的含义相同。
(4)保留(Reserved)。
(5)局部彩色表大小(SizeofLocalColorTable)域的值用来计算局部彩色表(GlobalColorTable)中包含的字节数。
5、局部彩色表
局部彩色表(LocalColorTable)用于紧跟在它后面的图像。
彩色表是否存在取决于图像描述块(ImageDescriptor)中局部彩色表标志(LocalColorTableFlag)位的设置。
彩色表的结构和大小与全局彩色表(GlobalColorTable)完全相同。
6、表基图像数据
GIF图像采用了LZW算法对实际的图像数据进行压缩。
为了提高压缩编码的效率,对LZW编码器输出的代码采用可变长度码VLC(variable-length-code),不是用位数高度的代码来表示输出,而且代表码字的位数是可变的。
表基图像数据(TableBasedImageData)由LZW最小代码长度(LZWMinimumCodeSize)和图像数据(ImageData)组成,如图8所示。
LZW最小代码长度域的值用来确定图像数据中LZW代码使用的初始位数。
图像数据(ImageData)由数据子块(DataSub-blocks)序列组成。
7
6
5
4
3
2
1
0
域的名称
类型
LZWMinimumCodeSize
LZW最小代码长度
Byte
ImageData
图像数据
Data Sub-blocks
图8图像数据的存储格式
数据子块(DataSub-blocks)的结构如图9所示,这是一个可变长度的数据块,其长度由块大小域(BlockSize)域中的值确定,字节数在0~255之间。
76543210
字节号
域的名称
数据类型
BlockSize
0
块大小
Byte
1
Byte
Byte
DataValues
数值
Byte
Byte
…
…
…
…
Byte
多
Byte
到
Byte
255
Byte
图9数据子块的结构
7、图形控制扩展块
图形控制扩展块(GraphicControlExtension)包含处理图形描绘块时要使用的参数,它的结构如图10所示。
现说明如下:
(1)扩展导入符ExtensionIntroducer)用于识别扩展块的开始,域中的值是一个数值等于0x21的固定值。
(2)图形控制标签(GraphicControlLabel)用于标识当前块是一个图形控制扩展块,域中的值是一个数值等于0xF9的固定值。
(3)块大小(BlockSi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GIF 格式 详解