I
import
Unregistered / Unconfirmed
GUEST, unregistred user!
GIF(Graphics Interchange Format——图形交换格式)格式是目前最流行的图
形格式之一。它和其他的图形格式最大区别是GIF支持在一个文件中存储多副图形
,这就是我们能够制作GIF动画以及图形计数器的原因。GIF格式与硬件无关,可
以基于全彩色。虽然在一副图中GIF最多只允许256色,但这只是调色板的限制,
事实上我们可以从无限多的颜色中生成这个256色的调色板。 和大多数图形格式
一样,GIF文件为压缩的图形数据生成了一个表头。它记录了该图形文件的一些基
本信息。
GIF文件的表头格式如下:
0000H-0005H:GIF标识。前三个byte是“GIF”,后三个byte是版本号,单副图形
的版本号通常是“87a”。GIF动画的版本号通常是“89a”。
0006H-0009H:图形的宽度和高度,单位是像素。宽度和高度各用两个字节表示(
16位整数)。
000AH :全局...标志(flag)。全局标志用来定义该图形的颜色数以及全局调色
板的信息。全局标志中的最高位(第八位)用来表示该图形文件是否存在一个全
局调色板(我在文章开头已经说过了,GIF允许在一个文件中存储多副图形,单个
图形所对应的调色板,我们称之为局部调色板,而相对于全体图形的调色板则称
之为全局调色板)。“1”代表有,“0”代表无。必须注意的是,由全局标志所
限定的全局调色板只是一个确省值,如果单个图形拥有自己的局部调色板,则全
局调色板失效。(通常情况下,单个图形不设局部调色板,确省的使用全局调色
板)。
全局标志的低三位+1就是该图形文件颜色以2为底数的指数值。例如,低三位为“
111”则表明本文件的全局调色板包括256种颜色;低三位为000则表明是全局调色
板只包括两种颜色。依此类推。这里所限定的颜色数作用于该文件中的所有图形
(全局数据)。
000BH :背景颜色。这里定义了该文件中图形的背景颜色。需要指出的是,这
里的颜色值是相对于调色板的值。也就是说,“1”代表调色板中的第一种颜色
。如果等于零,则说明图形为透明。
000CH :等于零。如果不等于零,则说明文件有错。
000DH :如果全局标志中指明存在全局调色板,那么该调色板就从这里开始。
调色板的格式是标准的RGB格式,每个颜色用三个Byte表示,分别对应红绿蓝三
色的百分比。
全局数据结束。
在全局数据之后的剩余数据就是相互独立的数据块了。
每个数据块的第一个Byte用来说明该数据块的类型。“,”表示该数据块是图形数
据;“!”表明这是一个扩充块(这是GIF留给用户进行扩充定义的,很少。在程
序中通常忽略这类数据块);“;”表示全部数据结束,这是文件的结尾。
主要说明一下以“,”开头的图形数据块。每一个以“,”开头的图形数据块都意
味着一个独立的图形。它也分做表头和数据两部分。表头格式如下(为方便表示
,以下地址以局部图形数据块第一字节为相对0000H):
0000H:“,”;
0001H-0002H:左边界;
0003H-0004H:上边界;
0005H-0006H:宽度;
0007H-0008H:高度;
注意,以上数值均为图形全局尺寸的相对位置。
0009H :局部标志位。局部标志位格式于用途基本上和全局标志相同。只是
它的作用域为单个图形,因此所限定的调色板为局部调色板。还需要注意的是这
个Byte的第七位,它用来表明该图形是否使用隔行扫描。“1”表示隔行,“0”
表示不隔行。
如果是图形定义为不隔行扫描,则未压缩的数据与物理屏幕一一对应。如果定义
为隔行扫描,则未压缩数据的获得要相对复杂些。这将在例程中讨论。
000AH :如果局部标志位定义了局部调色板,则从这里开始。如果没有,就是
正式的图形数据的第一个Byte了。
图形数据采用LZW技术压缩。我们将再晚些时候的“GIF图形的生成与还原(二)
” 中专门论述。
形格式之一。它和其他的图形格式最大区别是GIF支持在一个文件中存储多副图形
,这就是我们能够制作GIF动画以及图形计数器的原因。GIF格式与硬件无关,可
以基于全彩色。虽然在一副图中GIF最多只允许256色,但这只是调色板的限制,
事实上我们可以从无限多的颜色中生成这个256色的调色板。 和大多数图形格式
一样,GIF文件为压缩的图形数据生成了一个表头。它记录了该图形文件的一些基
本信息。
GIF文件的表头格式如下:
0000H-0005H:GIF标识。前三个byte是“GIF”,后三个byte是版本号,单副图形
的版本号通常是“87a”。GIF动画的版本号通常是“89a”。
0006H-0009H:图形的宽度和高度,单位是像素。宽度和高度各用两个字节表示(
16位整数)。
000AH :全局...标志(flag)。全局标志用来定义该图形的颜色数以及全局调色
板的信息。全局标志中的最高位(第八位)用来表示该图形文件是否存在一个全
局调色板(我在文章开头已经说过了,GIF允许在一个文件中存储多副图形,单个
图形所对应的调色板,我们称之为局部调色板,而相对于全体图形的调色板则称
之为全局调色板)。“1”代表有,“0”代表无。必须注意的是,由全局标志所
限定的全局调色板只是一个确省值,如果单个图形拥有自己的局部调色板,则全
局调色板失效。(通常情况下,单个图形不设局部调色板,确省的使用全局调色
板)。
全局标志的低三位+1就是该图形文件颜色以2为底数的指数值。例如,低三位为“
111”则表明本文件的全局调色板包括256种颜色;低三位为000则表明是全局调色
板只包括两种颜色。依此类推。这里所限定的颜色数作用于该文件中的所有图形
(全局数据)。
000BH :背景颜色。这里定义了该文件中图形的背景颜色。需要指出的是,这
里的颜色值是相对于调色板的值。也就是说,“1”代表调色板中的第一种颜色
。如果等于零,则说明图形为透明。
000CH :等于零。如果不等于零,则说明文件有错。
000DH :如果全局标志中指明存在全局调色板,那么该调色板就从这里开始。
调色板的格式是标准的RGB格式,每个颜色用三个Byte表示,分别对应红绿蓝三
色的百分比。
全局数据结束。
在全局数据之后的剩余数据就是相互独立的数据块了。
每个数据块的第一个Byte用来说明该数据块的类型。“,”表示该数据块是图形数
据;“!”表明这是一个扩充块(这是GIF留给用户进行扩充定义的,很少。在程
序中通常忽略这类数据块);“;”表示全部数据结束,这是文件的结尾。
主要说明一下以“,”开头的图形数据块。每一个以“,”开头的图形数据块都意
味着一个独立的图形。它也分做表头和数据两部分。表头格式如下(为方便表示
,以下地址以局部图形数据块第一字节为相对0000H):
0000H:“,”;
0001H-0002H:左边界;
0003H-0004H:上边界;
0005H-0006H:宽度;
0007H-0008H:高度;
注意,以上数值均为图形全局尺寸的相对位置。
0009H :局部标志位。局部标志位格式于用途基本上和全局标志相同。只是
它的作用域为单个图形,因此所限定的调色板为局部调色板。还需要注意的是这
个Byte的第七位,它用来表明该图形是否使用隔行扫描。“1”表示隔行,“0”
表示不隔行。
如果是图形定义为不隔行扫描,则未压缩的数据与物理屏幕一一对应。如果定义
为隔行扫描,则未压缩数据的获得要相对复杂些。这将在例程中讨论。
000AH :如果局部标志位定义了局部调色板,则从这里开始。如果没有,就是
正式的图形数据的第一个Byte了。
图形数据采用LZW技术压缩。我们将再晚些时候的“GIF图形的生成与还原(二)
” 中专门论述。