构件详解
1. GIF文件头
文件头描述块(Header)定义GIF数据流(GIF Data Stream),它的结构如图6-02所示。文件头描述块(Header)由GIF标记域(Signature)和版本号(Version)域组成,是一个由6个固定字节组成的数据块,它们用来说明使用的文件格式是GIF格式及当前所用的版本号。GIF标记域(Signature)存放的是“GIF”,版本号域存放的是1987年5月发布的“87a”或者1989年7月发布的“89a”,或者更加新的版本号。
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
字节号 |
域的名称 |
数据类型 | |||
|
|
0 |
|
| ||||||||||
|
Signature |
1 |
GIF标记 |
3 Bytes | ||||||||||
|
|
2 |
|
| ||||||||||
|
|
3 |
|
| ||||||||||
|
Version |
4 |
版本号 |
3 Bytes | ||||||||||
|
|
5 |
|
| ||||||||||
标记/版本数据块的结构
2. 逻辑屏幕描述块
逻辑屏幕描述块(Logical Screen Descriptor)包含定义图像显示区域的参数,包括背景颜色信息。这个数据块中的坐标相对于虚拟屏幕的左上角,不一定是指显示屏的绝对坐标,这就意味可以参照窗口软件环境下的窗口坐标或者打印机坐标来设计图像显示程序。逻辑屏幕描述块的结构如图6-03所示:
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
字节号 |
域的名称 |
类型 | ||||
|
Logical Screen Width |
0 |
逻辑屏幕宽度 |
Unsigned | |||||||||||
|
|
1 |
(以像素为定单位) |
| |||||||||||
|
Logical Screen Height |
2 |
逻辑屏幕高度 |
Unsigned | |||||||||||
|
|
3 |
(以像素为定单位) |
| |||||||||||
|
G |
CR |
S |
Size |
4 |
包装域 |
见图6-04 | ||||||||
|
Background Color Index |
5 |
背景颜色索引 |
Byte | |||||||||||
|
Pixel Aspect Ratio |
6 |
像素宽高比 |
Byte | |||||||||||
屏幕描述块的结构
逻辑描述块包含7个字节。字节0和字节1用来说明逻辑显示屏的宽度,字节3和字节4用来说明逻辑显示屏的高度,字节4用来描述彩色表的属性,字节5用来指定背景颜色索引,字节6用来计算像素的宽高比。现作如下说明:
(1) 屏幕描述块中的第5个字节称为包装域(Packed Fields),它的位结构如图6-04所示,它由4个子域组成:
①全局彩色表标志(Global Color Table Flag )域G用来说明是否有全局彩色表存在。如果G=1,表示有一个全局彩色表(Global Color Table)将紧跟在这个逻辑屏幕描述块(Logical Screen Descriptor)之后;这个标志也用来选择背景颜色索引(Background Color Index)。如果G=1,背景颜色索引(Background Color Index)域中的值就用作背景颜色的索引。
②彩色分辨率(Color Resolution)域CR用来表示原始图像可用的每种基色的位数(实际值减1)。这个位数表示整个调色板的大小,而不是这幅图像使用的实际的颜色数。例如,如果该域的值CR=3,说明原始图像可用每个基色有4位的调色板来生成彩色图像。
③彩色表排序标志(Sort Flag)域S用来表示全局彩色表(Global Color Table)中的颜色是否按重要性(或者称使用率)排序。如果S=0,表示没有重要性排序;如果S=1表示最重要的颜色排在前。这样做的目的是辅助颜色数比较少的解码器能够选择最好的颜色子集,在这种情况下解码器就可选择彩色表中开始段的彩色来显示图像。
④全局彩色表大小(Size of Global Color Table)域Size表示表示每个像素的位数,它用来计算全局彩色表(Global Color Table)中包含的字节数。在全局彩色表标志(Global Color Table Flag)域G=0时就不需要计算,G=1时就要计算彩色表的大小,具体计算见下文的“3. 全局彩色表”。
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
Global Color Table Flag |
Color Resolution |
Sort Flag |
Size of Global Color Table | ||||
逻辑屏幕描述块中的包装域结构
(2) 屏幕描述块中的第6个字节是背景颜色索引(Background Color Index),它是彩色表的一个索引值,用来指定背景颜色。如果全局彩色表标志(Global Color Table Flag)域G=0,这个域的值也设置为0。
(3) 像素宽高比(Pixel Aspect Ratio)域中的值是一个因数,是计算原始图像像素的宽高比的一个近似值。如果该域的值范围为1~255,如果不等于0,宽高比的近似值按下式计算:
Aspect Ratio = (Pixel Aspect Ratio + 15) / 64
像素宽高比(Pixel Aspect Ratio)定义成像素的宽度与高度之比,比值的范围在4:1~1:4之间,其增量为1/64。
3. 全局彩色表
由于一个GIF文件可以包含多幅彩色图像,每幅彩色图像也许都包含适合自身特点的彩色表,所以一个GIF文件可以有好几个彩色表。但归纳起来只有两类:全局彩色表(Global Color Table)或局部彩色表(Local Color Table)。全局彩色表可用于图像本身没有带彩色表的所有图像和无格式文本扩展块(Plain Text Extension),而局部彩色表只用于紧跟在它后面的一幅图像。在处理全局彩色表和局部彩色表时需要注意下面一些规则。
①如果GIF文件包含全局彩色表(Global Color Table),而且要显示的图像本身又带有局部彩色表,那末显示该幅彩色图像时就用它自己的彩色表,而不用全局彩色表。在这种情况下,解码器就首先保存全局彩色表(Global Color Table),然后使用局部彩色表(Local Color Table)来显示图像,最后再回复全局彩色表(Global Color Table)。
②全局彩色表(Global Color Table)和局部彩色表(Local Color Table)都是可选择的。由于这个原因,解码器最好要保存全局彩色表(Global Color Table),一直到出现另一个全局彩色表(Global Color Table)为止。这样做之后,对于包含完全没有彩色表的一幅或者多幅彩色图像的GIF文件就可以使用最后保存的全局彩色表(Global Color Table)进行处理。
③如果同类型的图像能够使用相同的彩色表来显示,编码器就要尽可能使用一个全局彩色表(Global Color Table);如果没有彩色表可用,解码器就可以使用计算机系统提供的彩色表或者解码器自身的彩色表。
④全局彩色表(Global Color Table)存在与否由逻辑屏幕描述块(Logical Screen Descriptor)中字节5的全局彩色表标志(Global Color Table Flag )域G的值确定。如果存在,彩色表就紧跟在逻辑屏幕描述块(Logical Screen Descriptor)之后。彩色表的表项数目等于2(n+1),其中n=b2b1b0,每个表项由3个字节组成,分别代表R、G、B的相对强度,因此彩色表的字节数就等于3×2(n+1)。
|
7 6 5 4 3 2 1 0 |
字节号 |
域的名称 |
数据类型 |
|
red intensity |
0 |
红色索引 000 |
Byte |
|
green intensity |
1 |
绿色索引 000 |
Byte |
|
blue intensity |
2 |
蓝色索引 000 |
Byte |
|
red intensity |
3 |
红色索引 001 |
Byte |
|
green intensity |
4 |
绿色索引 001 |
Byte |
|
blue intensity |
5 |
蓝色索引 001 |
Byte |
|
… |
… |
… |
|
|
… |
… |
… |
|
|
red intensity |
745 |
红色索引 255 |
Byte |
|
green intensity |
746 |
绿色索引 255 |
Byte |
|
blue intensity |
767 |
蓝色索引 255 |
Byte |
彩色表结构
局部彩色表与全局彩色表有相同的存储格式。
4. 图像描述块
GIF图像文件格式可包含数量不限的图像,而且也没有一个固定的存放顺序,仅用一个字节的图像分隔符(Image Separator)来判断是不是图像描述块。每一幅图像都由一个图像描述块(Image Descriptor)、可有可无的局部彩色表(Local Color Table)和图像数据组成。每幅图像必须要落在逻辑屏幕描述块(Logical Screen Descriptor)中定义的逻辑屏(Logical Screen)尺寸范围里。
图像描述块(Image Descriptor)之前可以有一个或者多个控制块,例如图形控制扩展块(Graphic Control Extension),其后可以跟着一个局部彩色表(Local Color Table)。无论前后是否有各种数据块,图像描述块(Image Descriptor)总是带有图像数据。
图像描述块(Image Descriptor)的结构如图所示。
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
字节号 |
域的名称 |
类型 | ||||
|
Image Separator |
0 |
图像分隔符 |
Byte | |||||||||||
|
Image Left Position |
1 |
图像左边位置 |
Unsigned | |||||||||||
|
|
2 |
(以像素为定单位) |
| |||||||||||
|
Image Top Position |
3 |
图像顶部位置 |
Unsigned | |||||||||||
|
|
4 |
(以像素为定单位) |
| |||||||||||
|
Image Width |
5 |
图像宽度 |
Unsigned | |||||||||||
|
|
6 |
(以像素为定单位) |
| |||||||||||
|
Image Height |
7 |
图像高度 |
Unsigned | |||||||||||
|
|
8 |
(以像素为定单位) |
| |||||||||||
|
|
9 |
包装域 |
见图6-07 | |||||||||||
图像描述块的结构
图像分隔符(Image Separator)用来标识图像描述块的开始,该域包含固定的值:0x2C;图像左边位置(Image Left Position)是相对于逻辑屏幕(Logical Screen)最左边的列号,逻辑屏幕最左边的列好定义为0;图像顶部位置(Image Top Position) 是相对于逻辑屏幕(Logical Screen)顶部的行号,逻辑屏幕顶部的行号定义为0。
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
Local Color Table Flag |
Interlace Flag |
Sort Flag |
Reserved |
Size of Local Color Table | |||
图像描述块中的包装域结构
图像描述块(Image Descriptor)中的第9个字节称为包装域(Packed Fields)字节,它的位结构如图6-07所示,它由5个子域组成:
①局部彩色表标志(Local Color Table Flag )域L用来说明是否有局部彩色表存在。如果L=1,表示有一个局部彩色表(Local Color Table)将紧跟在这个图像描述块(Image Descriptor)之后;如果G=0,表示图像描述块(Image Descriptor)后面没有局部彩色表(Local Color Table),该图像要使用全局彩色表(Global Color Table)。
②交插显示标志(Interlace Flag)域I用来表示该图像是不是交插图像(Interlaced Images)。如果I=0,表示该图像不是交插图像,如果I=1表示该图像是交插图像。使用该位标志可知道图像数据是如何存放的。GIF文件格式定义了两种数据存储方式:一种是按图像行连续顺序存储,这个顺序与显示器上显示行的顺序相同;另一种按交插方式存储。交插图像按行分成如下所示的4组(Group):
Group 1:每隔8行组成一组,从第0行开始显示 /第1遍交插
Group 2:每隔8行组成一组,从第4行开始显示 /第2遍交插
Group 3:每隔4行组成一组,从第2行开始显示 /第3遍交插
Group 4:每隔2行组成一组,从第1行开始显示 /第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 |
交插图像显示顺序
③彩色表排序标志(Sort Flag)域的含义与全局彩色表(Global Color Table)中(Sort Flag)域的含义相同。
④保留(Reserved)。
⑤局部彩色表大小(Size of Local Color Table)域的值用来计算局部彩色表(Global Color Table)中包含的字节数。
5. 局部彩色表
局部彩色表(Local Color Table)用于紧跟在它后面的图像。彩色表是否存在取决于图像描述块(Image Descriptor)中局部彩色表标志(Local Color Table Flag)位的设置。彩色表的结构和大小与全局彩色表(Global Color Table)完全相同。

本文详细介绍了GIF文件的结构,重点讲解了逻辑屏幕描述块,包括背景颜色信息和彩色表属性。同时,讨论了全局彩色表的组成、大小计算及其在GIF文件中的作用,帮助理解GIF图像的内部工作机制。
447

被折叠的 条评论
为什么被折叠?



