快好知 kuaihz订阅看过栏目

 

GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在 1987 年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。GIF格式可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画

GIF格式自1987年由CompuServe公司引入后,因其体积小、成像相对清晰,特别适合于初期慢速的互联网,而大受欢迎。

历史

在早期,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语法的符号定义:

::= 头部 <;逻辑视屏> <;数据>* 尾记录

这个规则将;实体定义如下。它必须以头部开始,头部后面接一个逻辑视屏实体,该实体要用其他规则来定义。最后,数据实体接结束符。数据实体后面的*表示数据实体可以在此位置出现0或多次。

::= 头部 <;逻辑视屏> <;数据>* 尾记录

<;逻辑视屏> ::= 逻辑视屏描述块 [全局色表]

<;数据> ::= <;成象块> |<;特殊用途块>

<;成象块> ::= [图象控制扩充] <;成象块>

<;成象块> ::= <;基于表的图象> |纯文本扩充

<;基于表的图象> ::= 图象描述符 [局部色表] 图象数据

<;特殊用途块> ::= 应用扩充 |注释扩充

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

该字段的取值范围从最宽的比值4:1到最高的比值1:4,递增的步幅为1/64。

取值:0 - 没有比值,1~255 - 用于计算的值。

全局色表标志 - 指示有没有全局色表,如果该标志位置1,则全局色表会紧接在该块之后出现。该位也用于解释是否选用背景颜色索引字段。若该位置1,则背景颜色索引字段的值将指向背景颜色表。

色彩方案 - 提供给原始图像的每个颜色的位数减1。这个值代表图像中所使用的整个调色板的大小,而不是图像中所使用的颜色的数量。例如,若该字段的值为3,则图像中所使用的调色板的每个色值占4位。

短标志 - 表明全局色表是否被排序。如果该位置1,则全局色表按照重要性递减的原则进行了排序。典型地,是按照颜色的使用频度进行递减排序,使用频度最高的颜色排在色表的最前面。这样便可帮助解码器选择最好的颜色子集来成象。

全局色表的尺寸 - 如果全局色表标志位置1,则该字段的值记录全局色表中所占用的字节数。

全局色表

该块包含一个按照字节顺序表示红-绿-蓝三元色的色表。全局色表用于那些没有局部色表的图像和纯文本扩充。在逻辑视屏描述块中的全局色表标志位置1时表示有全局色表。全局色表紧接在逻辑视屏描述块之后,占用的字节数为:

3*2^(全局色表尺寸+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时,该表出现,且其后紧跟图像的描述符,它所包含的字节数等于

3*2^(局部色表尺寸+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。

投稿
非常不爽,删了吧! 相关词条:其他 图像 图像文件格式 压缩格式 50% 程序 动画 位图 背景图像 图片文件格式 作用域 字节顺序 图像控制 字符编码 单元格 象素 语法 扩充 数据流 图片