http://baike.baidu.com/view/7966.htm
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(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在 1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。目前几乎所有相关软件都支持它,公共领域有大量的软件在使用GIF图像文件。GIF图像文件的数据是经过压缩的,而且是采用了可变长度等压缩算法。所以GIF的图像深度从lbit到8bit,也即GIF最多支持256种色彩的图像。GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。
分 类
GIF分为静态GIF和动画GIF两种,支持透明背景图像,适用于多种操作系统,“体型”很小,网上很多小动画都是GIF格式。其实GIF是将多幅图像保存为一个图像文件,从而形成动画,所以归根到底GIF仍然是图片文件格式。但GIF只能显示256色。
GIF主要分为两个版本,即GIF 89a和GIF 87a:
GIF 87a:是在1987年制定的版本
GIF 89a:是1989年制定的版本。在这个版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程序编程接口等四个区块,并提供了对透明色和多帧动画的支持
GIF格式自1987年由CompuServe公司引入后,因其体积小而成像相对清晰,特别适合于初期慢速的互联网,而从此大受欢迎。它采用无损压缩技术,只要图像不多于256色,则可既减少文件的大小,又保持成像的质量。(当然,现在也存在一些hack技术,在一定的条件下克服256色的限制,具体参见真彩色)然而,256色的限制大大局限了GIF文件的应用范围,如彩色相机等。(当然采用无损压缩技术的彩色相机照片亦不适合通过网络传输。)另一方面,在高彩图片上有着不俗表现的JPG格式却在简单的折线上效果差强人意。因此GIF格式普遍适用于图表,按钮等等只需少量颜色的图像(如黑白照片)。
Gif文件格式
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版的协议中出现.
1.头部
0x0000~0x0001 标识符(3 字节) ---GIF
0x0003~0x0005 版本(3 字节) ---87a (or 89a)
2.逻辑视屏描述块
0x0006~0x0007 逻辑屏幕宽(2字节)
0x0008~0x0009 逻辑屏幕高(2字节)
0x000a Packed Fields (1字节)
Packed Fields说明:
全局色表标志 1 Bit
颜色方案 3 Bits
短标志 1 Bit
全局色表尺寸 3 Bits
0x000b 背景色索引(1字节)
0x000c 象素高宽比(1字节)
/*解释:
全局色表标志:指示有没有全局色表,如果该标志位置1,则全局色表会紧接在该块之后出现。
该位也用于解释是否选用背景颜色索引字段。若该位置1,则背景颜色索引字段的值将指向背景颜色表。(1)
色彩方案:提供给原始图像的每个颜色的位数减1。
这个值代表图像中所使用的整个调色板的大小,而不是图像中所使用的颜色的数量。
例如,若该字段的值为3,则图像中所使用的调色板的每个色值占4位。(110)
短标志:表明全局色表是否被排序。
如果该位置1,则全局色表按照重要性递减的原则进行了排序。
典型地,是按照颜色的使用频度进行递减排序,使用频度最高的颜色排在色表的最前面。
这样便可帮助解码器选择最好的颜色子集来成象。(0)
全局色表的尺寸:如果全局色表标志位置1,则该字段的值记录全局色表中所占用的字节数。(111)
背景颜色索引:为背景颜色指向全局色表。背景颜色是指那些没有背图像覆盖的视屏部分的颜色。
若全局色表标志位置为0,则该字段也被值0,并且被忽略。(0xd7)
象素高宽比:用于计算原图像中像素的近似高宽比。
如果该字段的值为非0,则象素的高宽比由下面的公式计算:
高宽比 = (象素高宽比 + 15) / 64
该字段的取值范围从最宽的比值4:1到最高的比值1:4,递增的步幅为1/64。
取值为0,则没有比值,1~255 - 用于计算的值。(0x00)
*/
0x000d~0x030c 3.全局色表
该块包含一个按照字节顺序表示红-绿-蓝三元色的色表。全局色表用于那些没有局部色表的图像和纯文本扩充。在逻辑视屏描述块中的全局色表标志位置1时表示有全局色表。全局色表紧接在逻辑视屏描述块之后,占用的字节数为:
3*2^(全局色表尺寸+1)(byte) 表所站字节 =3*2^8 =3*256 =768=0x300 多余部分补0 0xd~0xd+0x300 -0x1 =0x30c
数据组成格式为:
Red 0
Green 0
Blue 0
……
Red n
Green n
Blue n
0x000d~0x0294 {
0x000d~0x001e 00 01 02 03 04 05~~00 00 00 33 00 00 66 00 00 99 00 00 cc 00 00 ff 00 00 ~
0x001f~0x0031 06 07 08 09 0a 0b~~00 33 00 33 33 00 66 33 00 99 33 00 cc 33 00 ff 33 00 ~
0c 0d 0e 0f 10 11~~00 66 00 33 66 00 66 66 00 99 66 00 cc 66 00 ff 66 00 ~
12 13 14 15 16 17~~00 99 00 33 99 00 66 99 00 99 99 00 cc 99 00 ff 99 00 ~
18 19 1a 1b 1c 1d~~00 cc 00 33 cc 00 66 cc 00 99 cc 00 cc cc 00 ff cc 00 ~
1e 1f 20 21 22 23~~00 ff 00 33 ff 00 66 ff 00 99 ff 00 cc ff 00 ff ff 00 ~
24 25 26 27 28 29~~00 00 33 33 00 33 66 00 33 99 00 33 cc 00 33 ff 00 33 ~
`````
48 49 4a 4b 4c 4d~~00 00 66
```
6c 6d 6e 6f 70 71~~00 00 99
```
90 91 92 93 94 95~~00 00 cc
```
b4 b5 b6 b7 b8 b9~~00 00 ff 33 00 ff 66 00 ff 99 00 ff cc 00 ff ff 00 ff ~
ba bb bc bd be bf~~00 33 ff
c0 c1 c2 c3 c4 c5~~00 66 ff
c6 c7 c8 c9 ca cb~~00 99 ff
cc cd ce cf d0 d1~~00 cc ff
d2 d3 d4 d5 d6 d7~~00 ff ff 33 ff ff 66 ff ff 99 ff ff cc ff ff ff ff ff ~
}颜色数= 6*6*6 =216 ,字节数 =3*颜色数 =3*216 =648 =0x288
0x030d~0x0327 未知??
0x0328 4.图像描述符
每一幅图像必须在逻辑视屏描述块中所定义的逻辑视屏界限之内。图像描述符包含处理一个基于图像的表的必要参数。在这个块中给定的坐标是参照逻辑视屏的像素坐标。该块是一个成象块,在其前面可以选择加上一个或多个控制块,如:图像控制扩充,或者是后面接有局部色表;图像描述符后面总是图像数据。它是一幅图所必需的。一幅图像对应一个图像描述符。
数据组成格式为:(共12字节)
0x328 图象分隔符(1字节) 固定值0x2c =‘,’
0x329 图象左坐标(2字节)
0x32b 图象顶坐标(2字节)
0x32d 图象宽度(2字节)
0x32f 图象高度(2字节)
0x331 Packed Fields(1字节)
说明:
局部色表标志 1 Bit //同全局色表,置位时标识紧接在图象标识符之后有一个局部颜色列表,则使用全局颜色列表,忽略pixel值。
隔行处理标志 1 Bit //置位时图象数据使用交织方式排列(详细描述...),否则使用顺序排列。
短标志 1 Bit //同全局色表
保留 2 Bits //保留值 必须初始化为0
局部色表尺寸 3 Bits//同全局色表
/*解释:
图像分隔符 - 用于识别图像描述符的开始。取固定值0x2c*/
0xxxxx 5.局部色表
该块包含一个按照红-绿-兰三原色的顺序排列的色表。该表作用于紧跟其后的图像数据。
当局部色表标志位置1时,该表出现,且其后紧跟图像的描述符,它所包含的字节数等于
3*2^(局部色表尺寸+1)
数据组成格式为:
Red 0
Green 0
Blue 0
……
Red n
Green n
Blue n
6.基于表的图像数据
基于表的图像数据由一系列子块组成,每个子块最多255字节,包含一个为图中每个象素所指定的有效色表的索引。索引的顺序用LZW算法进行编码。
数据组成格式为:
LZW 最小编码尺寸(1字节)
图象数据数据子块(n字节)
解释:
LZW 最小编码尺寸:该字节用于决定在图像数据中用 LZW 编码最初的位数。
0x320~0x327 7.图像控制扩充(版本-89a) 0x21f9
图像控制扩充包含在处理一个成象块时所需的参数。扩充只包括一个数据子块。该块是可选的。通常只有一个图像控制扩充在成象块之前。这也是在一个数据流中对成象控制扩充的唯一限制。
数据组成格式为:(共8字节)
扩充导入符(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长度字段标志着图像控制扩充得结束。
*/
8.注释扩充(版本-89a)0x21fe
注释扩充包含实际不属于gif数据流的文本信息。它适用于包括图像注释、描述或者任何其他非控制和非图像数据。注释扩充将被解码器忽略,或者被保留到以后处理。在任何情况下注释扩充也不能中断对数据流的处理。该块是可选的;在数据流中的出现量不加限制。
数据组成格式为:(共3+n个字节)
扩充导入符(1字节)
注释标记(1字节)
注释数据数据子块(n字节)
块结束符(1字节)
/*解释:
扩充导入符:标识扩充的开始。该字段为固定值 0x21。
注释标号:标示某块为注释扩充。该段为固定值 0xFE。
注释数据:按照子块顺序,每个注释最少1字节最多255字节。序列结尾用块结束符标识。
块结束符:用来标识注释扩充的结束。*/
9.纯文本扩充(版本-89a)0x2101
纯文本扩充包括纯文本数据和将数据显示为图像所必需的参数。文本数据将用7位可印刷ASCII码字符编码。文本数据用在块字段中定义的单元格字符元素来成象。每个字符用一个单元成象。该块使用全局色表。它可以被图形控制扩充来修改。该块为可选块。
数据组成格式为:(共16+n个字节)
扩充导入符(1字节)
纯文本标记(1字节)
块尺寸(1字节)
文本格左坐标(2字节)
文本格顶坐标(2字节)
文本格宽度(2字节)
文本格高度(2字节)
字符单元宽度(1字节)
字符单元宽度(1字节)
文本前景色索引(1字节)
文本背景色索引(1字节)
纯文本数据数据子块(n字节)
块结束符(1字节)
/*解释:
扩充导入符 - 标识一个扩充块的开始。取固定值0x21.
纯文本标记 - 标识当前块为原文扩充。取固定值0x01.
块尺寸 - 扩充中的字节数,取固定值12.
文本格左位置 - 逻辑视屏的左边,用象素表示的左边列数,
文本格顶位置 - 逻辑视屏的上边,用象素表示的上边行数。
原文数据 - 子块序列,每个子块最少1字节最多255字节。该序列遇到块结束符时结束。
块结束符– 0,用来标志块结束。*/
10.应用扩充(版本-89a)0x21ff
应用扩充包含应用说明信息;它遵守如下所述的扩充块的语法,块标记为0xff.
数据组成格式为:(共16+n个字节)
扩充导入符(1字节)
扩充标记(1字节)
块尺寸(2字节)
应用标识符(8字节)
应用证明码(3字节)
应用数据数据子块(n字节)
块结束符(1字节)
/*解释:
扩充引入符 - 定义该块位扩充块。取固定值0x21.
应用扩充标记 - 标识该块为应用扩充块。取固定值0xFF.
块尺寸 - 指示该块中包含的字节数。取固定值0xb.
应用标识符 - 8格可印刷ASCII字符用来标识该应用所属的应用扩充。
应用证明码 - 3格字节的序列用于证明应用标识符。一个应用程序可以一种算法来计算一个二进制码来唯一地识别这个应用是否数于这个应用扩充。*/
0x1583 11.尾记录
该块为一个单字段块,用来指示该数据流的结束。取固定值0x3b.
制作软件
目前从动画或影视剧中截取并加工GIF动态图的软件有许多,最常见的有“腾讯QQ”和“Ulead GIF Animator“ 等,具体可以根据个人喜好加以选择。百度圣域gif作坊吧的教程学习区里包含一些简单的GIF动态截图教程,可供学习。链接如下:
【闪字教程】教你如何制作简单的GIF闪字(附图)~~~
http://tieba.baidu.com/f?kz=170007909
【图文教程】QQ截图的简单教程(转载),FROM:截图吧
http://tieba.baidu.com/f?kz=171265515
【转贴】截取MV和制作GIF的教程 BY天使水精灵
http://tieba.baidu.com/f?kz=219291538
制作软件主要为Adobe ImageReady 和 fireworks 两个!
缺陷:gif动画图片失真较大,一般经过羽化等效果处理的透明背景图都会出现杂边,而要处理掉这些难看的杂边是件很复杂费时的工作!所以如果能解决透明图出现杂边的不足将是gif的一个重大突破了!望早日实现!
如何制作
用photoshop制作gif动画图片指导
只要是photoshop6.0以上的就用自带ImageReady ,先找到你要做的原图 ,然后
第一步:
启动photoshop,并打开需要的两幅图!
第二步:
会弹出修改框,修改宽度和高度的像素。注意下面红线里的约束比例!要改成非比例的大小就把勾点去!然后将两副图片的大小调一致!
第三步
很多JPG格式的图在photoshop8.0里锁定的,所以双击图层里的背景项,会弹出一个选项框,选择好~将背景变为图层!(同理,另一幅图片也这么做。但注意在photoshop里通过点击图片来改变当前编辑的图片,所以改另一副图先点击一下)
第四步
选择左边工具条上面左边的工具! 然后点住一幅图片将它拖至另一副图片里! 这时在图层里应该是有两个图层! 将两个图片根据画面的大小对对好~按保存!
第五步:
这时启动ImageReady,打开你刚保存的图片!
第六步:
在动画工具条里点击“复制当前帧”,复制后,在动画里会显示有两个帧!
第七步:
点击动画工具里的“过度...”按扭! 点击后会出现过度对话框!在“要添加的帧数”里选择你希望的帧数,默认是5,这里我们也选择5,然后点击“好” 这时动画栏里会显示有7个帧!
第八步
这时看看图层里的当前图层是否为上面的图,不是的话点击来改变当前图层! (注意有兰色条显示的就是当前图层!) 选择好当前图层后,点击动画栏里第二个帧!点中后第二帧应该是兰色的! 然后在图层栏那边改透明度!将其从100%改为80%
第九步
接着选择第三个帧 将其不透明值改为60%
第十步:
同样的方法点击第4帧!将其不透明值改成40%。
点击第5帧,将其不透明值改成20%
第十一步:
点击第1帧,点击“选择帧延迟时间”点击后会弹出个菜单!选择0.2秒延迟后,第1帧下面会变为0.2秒。当然可以根据你的喜好改变。
第十二步:
点击第7帧,和上面一样延迟0。2秒
第十三步:
点击“播放”按扭。就可以看到效果了
第十四步:
准备保存了,在转为GIF文件前,先设下优化值!在预设一项将其值改为 GIF 128 仿色 然后选择文件菜单里的“将优化结果存储为” 选择文件名后,按好!就OK了!
GIF文件格式(GIF file)
GIF文件格式采用了可变长度的压缩编码和其它一些有效的压缩算法,按行扫描迅速解码,且与硬件无关。它支持256种颜色的彩色图像,并且在一个GIF文件中可以记录多幅图像。包括文件头(Head Block)、注释块(Comment Block)、循环块(Loop Block)、控制块(Control Block)、GIF图像块(Image Block)、文本块(Plain Text Block)、附加块(Application Block)。
参考资料:
1.中国域名网http://www.gifbbs.com
2.美图论坛:http://http://www.gifbbs.com/index.php