GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在 1987年开发的图像档案格式。GIF档案的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何套用程式。GIF格式可以存多幅彩色图像,如果把存于一个档案中的多幅图像数据逐幅读出并显示到萤幕上,就可构成一种最简单的动画。
GIF格式自1987年由CompuServe公司引入后,因其体积小、成像相对清晰,特别适合于初期慢速的网际网路,而大受欢迎。
基本介绍
- 中文名图像互换格式
- 外文名GIF
- 出品公司CompuServe
- 开发时间1987年
- 发明者Steve Wilhite
- 分类静态GIF|动画GIF
- 扩展名.gif
历史
在早期,GIF所用的LZW压缩算法
是Compuserv所开发的一种免费
算法。令很多软体开发商感到意外的是,GIF档案所採用的压缩算法忽然成了Unisys公司的专利。
据Unisys公司称,他们已注册了LZW算法中的W部分。如果要开发生成(或显示)GIF档案的程式,则需向该公司支付版税。由此,人们开始寻求一种新技术,以减少开发成本。
PNG(Portable Network Graphics,便携网路图形)标準就在这个背景下应运而生了。它一方面满足了市场对更少的法规限制的需要,另一方面也带来了更少的技术上的限制,如颜色的数量等。
在2003年6月20日,LZW算法在美国的专利权已到期而失效。在欧洲、日本及加拿大的专利权亦已分别在2004年的6月18日、6月20日和7月7日到期失效。儘管如此,PNG档案格式凭着其技术上的优势,已然跻身于网路上第三广泛套用格式。与GIF相关的专利于2006年8月11日过期。
分类
GIF分为静态GIF和动画GIF两种,扩展名为.gif,是一种压缩点阵图格式,支持透明背景图像,适用于多种作业系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像档案,从而形成动画,最常见的就是通过一帧帧的动画串联起来的搞笑gif图,所以归根到底GIF仍然是图片档案格式。
但GIF只能显示256色。和jpg格式一样,这是一种在网路上非常流行的图形档案格式。
GIF主要分为两个版本,即GIF 89a和GIF 87a
GIF 87a是在1987年制定的版本
GIF 89a是1989年制定的版本。在这个版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程式编程接口等四个区块,并提供了对透明色和多帧动画的支持
格式
语法
语法是用来表达序列的一种符号形式,并用这个表达序列中的一些对象来形成更大的对象。语法也用于表达在给定的位置出现对象的数目。在此给出的语法用来说明形成gif数据流的块序列,用一些规则列表来表达。下面列出用于gif语法的符号定义。
图例 <> 语法词
::= 符号定义
0个或更多的事件发生
+ 1个或更多的事件发生
| 替代元素
[] 可选元素
gif语法的符号定义:
<GIF数据流> ::= 头部 <;逻辑视屏> <;数据> 尾记录
这个规则将<Gif 数据流>;实体定义如下。它必须以头部开始,头部后面接一个逻辑视屏实体,该实体要用其他规则来定义。,数据实体接结束符。数据实体后面的表示数据实体可以在此位置出现0或多次。
<Gif 数据流> ::= 头部 <;逻辑视屏> <;数据> 尾记录
<;逻辑视屏> ::= 逻辑视屏描述块 [全局色表]
<;数据> ::= <;成象块> |<;特殊用途块>
<;成象块> ::= [图象控制扩充] <;成象块>
<;成象块> ::= <;基于表的图象> |纯文本扩充
<;基于表的图象> ::= 图象描述符 [局部色表] 图象数据
<;特殊用途块> ::= 套用扩充 |注释扩充
gif数据流中的数据块可以分为三组控制块、成象块和特殊用途块。
控制块,如头部、逻辑视屏描述块、图像控制扩充和尾记录,包含用于控制处理数据流或设定硬体参数的信息。
成像块,如图像描述符和纯文本扩充,包含用于在显示设备上成像的信息和数据。
特殊用途块,如注释扩充和套用扩充,包含那些既不用于处理数据流也不用于在显示设备上成象的信息。
除了逻辑视屏描述块和全局色表之外,特殊用途块的作用域是整个数据流,而其他控制块的作用域是有限的,仅限于对他们后面的成象块起作用。特殊用途块不对任何控制块构成限制,它对于解码过程来说是透明的。成象块及扩充用于控制块及扩充的作用域限定。块的标记分为三段除尾记录0x3b之外,0x00~0x7f用于成象块;0x80~0xf9用于控制块;0xfa~0xff用于特殊用途块。解码器通过识别块标记来处理块的作用域。
解释
色表- gif格式利用色表来显示基于光栅的图像。色表分为全局色表和局部色表。全局色表对于那些没有设定局部色表的图像起作用。全局色表的作用域是整个数据流。局部色表对于紧接在其后的单张图像起作用。这两种色表都是可选的。
全局色表这东西是我们感兴趣的东西,它有点像png格式定义种的调色板,如果要修改gif图片的颜色,修改这个全局色表就可以.如果有全局色表块,那幺它一定从gif流的14个位元组开始(头部6个 + 逻辑视频描述块7个)。
以下是各数据块的说明,如果注明为版本89a的话,则说明这个数据块不会在87a版的协定中出现.
头部(6个位元组)
标识符(Signature)(3位元组) ---GIF
版本(3位元组) ---87a (or 89a)
逻辑视屏描述块
逻辑萤幕宽(2位元组)
逻辑萤幕高(2位元组)
Packed Fields (1位元组)
背景色索引(1位元组)
象素高宽比(Aspect Ratio)(1位元组)
Packed Fields说明
全局色表(Global Color Map)标誌 1 Bit
颜色方案 3 Bits
短标誌 1 Bit
全局色表尺寸 3 Bits
解释
背景颜色索引 - 为背景颜色指向全局色表。背景颜色是指那些没有背图像覆盖的视屏部分的颜色。若全局色表标誌位置为0,则该栏位也被值0,并且被忽略。
象素高宽比 - 用于计算原图像中像素的近似高宽比。如果该栏位的值为非0,则象素的高宽比由下面的公式计算
高宽比 = (象素高宽比 + 15) / 64
该栏位的取值範围从最宽的比值41到最高的比值14,递增的步幅为1/64。
取值0 - 没有比值,1~255 - 用于计算的值。
全局色表标誌 - 指示有没有全局色表,如果该标誌位置1,则全局色表会紧接在该块之后出现。该位也用于解释是否选用背景颜色索引栏位。若该位置1,则背景颜色索引栏位的值将指向背景颜色表。
色彩方案 - 提供给原始图像的每个颜色的位数减1。这个值代表图像中所使用的整个调色板的大小,而不是图像中所使用的颜色的数量。例如,若该栏位的值为3,则图像中所使用的调色板的每个色值占4位。
短标誌 - 表明全局色表是否被排序。如果该位置1,则全局色表按照重要性递减的原则进行了排序。典型地,是按照颜色的使用频度进行递减排序,使用频度最高的颜色排在色表的最前面。这样便可帮助解码器选择最好的颜色子集来成象。
全局色表的尺寸 - 如果全局色表标誌位置1,则该栏位的值记录全局色表中所占用的位元组数。
全局色表
该块包含一个按照位元组顺序表示红-绿-蓝三元色的色表。全局色表用于那些没有局部色表的图像和纯文本扩充。在逻辑视屏描述块中的全局色表标誌位置1时表示有全局色表。全局色表紧接在逻辑视屏描述块之后,占用的位元组数为
32^(全局色表尺寸+1)
数据组成格式为
Red 0 Green 0
Blue 0 Red n
Green n Blue n
图像控制扩充(版本-89a)
图像控制扩充包含在处理一个成象块时所需的参数。扩充只包括一个数据子块。该块是可选的。通常只有一个图像控制扩充在成象块之前。这也是在一个数据流中对成象控制扩充的唯一限制。
数据组成格式为
扩充导入符(1位元组)图象控制标记(1位元组)
块尺寸(1位元组) Packed Fields (1位元组)
延长时间(2位元组) 透明颜色索引(1位元组)
块结束(1位元组) Packed Fields说明
保留 3 Bits 配置方法 3 Bits
用户输入标誌 1 Bit 透明颜色标誌 1 Bit
解释
扩充引入 - 用于识别一个扩充块的开始,该栏位为固定值0x21。
图像控制标号 - 识别当前块是否为图形控制扩充。该栏位为固定值 0xF9。
块尺寸 - 块中所包含的位元组数。从块尺寸栏位开始到快结束符(不含结束符)。该栏位包含固定值4。
配置方法 - 指示图像显示后的处理方法。值
0 - 无指定的配置,解码器不需要做任何处理。
1 - 不做配值。图像将被留在原位置。
2 - 恢复背景颜色。图像所占的区域必须备恢复为背景颜色。
3 - 恢复以前的颜色。解码器需要将图像区域恢复为原来成象的颜色。
4-7 - 未定义。
用户输入标誌 - 说明在继续处理之前是否需要用户输入。可以和输入延时一起使用。
透明标誌 - 表明在透明索引栏位是否给定透明索引。
延时 - 如果不为0,该栏位指定以1/100秒为单位的时延数。
透明索引 - 如果遇到透明索引,则显示设备的相关象素不被改变,继续处理下一个象素。
块终止符 - 这个0长度栏位标誌着图像控制扩充得结束。
图像描述符
每一幅图像必须在逻辑视屏描述块中所定义的逻辑视屏界限之内。图像描述符包含处理一个基于图像的表的必要参数。在这个块中给定的坐标是参照逻辑视屏的像素坐标。该块是一个成象块,在其前面可以选择加上一个或多个控制块,如图像控制扩充,或者是后面接有局部色表;图像描述符后面总是图像数据。它是一幅图所必需的。一幅图像对应一个图像描述符。
数据组成格式为
图象分隔设定(1位元组) 图象左坐标(2位元组)
图象顶坐标(2位元组) 图象宽度(2位元组)
图象高度(2位元组)
Packed Fields说明
局部色表标誌 1 Bit 隔行处理标誌 1 Bit
短标誌 1 Bit 保留 2 Bits
局部色表尺寸 3 Bits
解释
图像分隔设定- 用于识别图像描述符的开始。取固定值0x2c
局部色表
该块包含一个按照红-绿-兰的顺序排列的色表。该表作用于紧跟其后的图像数据。当局不色表标誌位置1时,该表出现,且其后紧跟图像的描述符,它所包含的位元组数等于
32^(局部色表尺寸+1)
数据组成格式为
Red 0 Green 0
Blue 0 ……
Red n Green n
Blue n
基于表的图像数据
基于表的图像数据由一系列子块组成,每个子块最多255位元组,包含一个为图中每个象素所指定的有效色表的索引。索引的顺序用LZW算法进行编码。
数据组成格式为
LZW 最小编码尺寸(1位元组)
图象数据数据子块(n位元组)
解释
LZW 最小编码尺寸该位元组用于决定在图像数据中用 LZW 编码最初的位数。
注释扩充(版本-89a)
注释扩充包含实际不属于gif数据流的文本信息。它适用于包括图像注释、描述或者任何其他非控制和非图像数据。注释扩充将被解码器忽略,或者被保留到以后处理。在任何情况下注释扩充也不能中断对数据流的处理。该块是可选的;在数据流中的出现量不加限制。
数据组成格式为
扩充导入符(1位元组)
注释标记(1位元组)
注释数据数据子块(n位元组)
块结束符(1位元组)
解释
扩充导入符 - 标识扩充的开始。该栏位为固定值0x21。
注释标号 - 标示某块为注释扩充。该段为固定值0xFE。
注释数据 - 按照子块顺序,每个注释最少1位元组最多255位元组。序列结尾用块结束符标识。
块结束符 -用来标识注释扩充的结束。
纯文本扩充(版本-89a)
纯文本扩充包括纯文本数据和将数据显示为图像所必需的参数。文本数据将用7位可印刷ASCII码字元编码。文本数据用在块栏位中定义的单元格字元元素来成象。每个字元用一个单元成象。该块使用全局色表。它可以被图形控制扩充来修改。该块为可选块。
数据组成格式为
扩充导入符(1位元组) 纯文本标记(1位元组)
块尺寸(1位元组) 文本格左坐标(2位元组)
文本格顶坐标(2位元组) 文本格宽度(2位元组)
文本格高度(2位元组) 字元单元宽度(1位元组)
字元单元宽度(1位元组) 文本前景色索引(1位元组)
文本背景色索引(1位元组) 纯文本数据数据子块(n位元组)
块结束符(1位元组)
解释
扩充导入符 - 标识一个扩充块的开始。取固定值0x21.
纯文本标记 - 标识当前块为原文扩充。取固定值0x01.
块尺寸 - 扩充中的位元组数,取固定值12.
文本格左位置 - 逻辑视屏的左边,用象素表示的左边列数,
文本格顶位置 - 逻辑视屏的上边,用象素表示的上边行数。
原文数据 - 子块序列,每个子块最少1位元组最多255位元组。该序列遇到块结束符时结束。
块结束符– 0,用来标誌块结束。
套用扩充(版本-89a)
套用扩充包含套用说明信息;它遵守如下所述的扩充块的语法,块标记为0xff.
数据组成格式为
扩充导入符(1位元组) 扩充标记(1位元组)
块尺寸(2位元组) 套用标识符(8位元组)
套用证明码(3位元组) 套用数据数据子块(n位元组)
块结束符(1位元组)
解释
扩充引入符 - 定义该块位扩充块。取固定值0x21.
套用扩充标记 - 标识该块为套用扩充块。取固定值0xFF.
块尺寸 - 指示该块中包含的位元组数。取固定值11.
套用标识符- 8格可印刷ASCII字元用来标识该套用所属的套用扩充。套用证明码 - 3格位元组的序列用于证明套用标识符。一个应用程式可以一种算法来计算一个二进制码来唯一地识别这个套用是否数于这个套用扩充。
尾记录
该块为一个单栏位块,用来指示该数据流的结束。取固定值0x3b.
製作
PC上製作软体主要为Adobe ImageReady 和 fireworks 两个。
WEB上gif线上製作编辑gif5.net,支持图片、视频、FLASH转GIF。