gif图片格式解析

来源:互联网 发布:淘宝申请售后 编辑:程序博客网 时间:2024/06/05 04:38
gif图片格式解析
飘飘白云整理
参考:
http://www.w3.org/Graphics/GIF/spec-gif89a.txt
网络中文gif资料
 
简介:
GIF(Graphics Interchange Format)CompuServe公司开发像文件存格式,1987开发GIF文件格式版本号是GIF87a1989行了充,充后的版本号定义为GIF89a
 
GFI像文件以数据(block)为单位来存储图像的相信息。一个GIF文件由表示/像的数据、数据子以及/像的控制信息块组成,称GIF数据流(Data Stream)。数据流中的所有控制信息和数据都必在文件(Header)和文件(Trailer)
 
GIF文件格式采用了LZW(Lempel-Ziv Walch)压缩算法来存储图像数据,定了允户为图置背景的透明(transparency)属性。此外,GIF文件格式可在一个文件中存放多幅彩色/像。如果在GIF文件中存放有多幅,它可以像演幻灯片那样显示或者像画那演示。
 
GIF .
  法是用来表达序列的一符号形式,并用个表达序列中的一些象来形成更大的象。法也用于表达在定的位置出现对象的数目。在此出的法用来明形成gif数据流的序列,用一些规则列表来表达。下面列出用于gif法的符号定
: <> 
::= 符号定
* 0个或更多的事件
+ 1个或更多的事件
替代元素
[] 元素
gif法的符号定:
<GIF 数据流> ::=  <逻辑视> <数据>* 记录
规则<Gif 数据流>体定如下。它必始,部后面接一个逻辑视体,该实用其他规则来定。最后,数据体接束符。数据体后面的*表示数据体可以在此位置出0或多次。
:
<Gif 数据流> ::=  <逻辑视> <数据>* 记录
<逻辑视> ::= 逻辑视屏描述 [全局色表]
<数据> ::= <成象> |<特殊用途>
<成象> ::= [象控制] <成象>
<成象> ::= <基于表的> |文本
<
基于表的> ::= 象描述符 [局部色表象数据
<
特殊用途> ::=  |释扩
 
gif数据流中的数据可以分:控制、成象和特殊用途
控制,如:部、逻辑视屏描述像控制充和尾记录,包含用于控制理数据流或置硬件参数的信息。
成像,如:像描述符和文本充,包含用于在设备上成像的信息和数据。
特殊用途,如:注释扩充和充,包含那些既不用于理数据流也不用于在设备上成象的信息。
除了逻辑视屏描述和全局色表之外,特殊用途的作用域是整个数据流,而其他控制的作用域是有限的,限于后面的成象起作用。特殊用途任何控制构成限制,它于解码过程来是透明的。成象充用于控制充的作用域限定。标记三段:除尾记录0x3b之外,0x000x7f用于成象;0x800xf9用于控制0xfa0xff用于特殊用途。解器通过识别块标记的作用域。
 
解释:
色表- gif格式利用色表来示基于光像。色表分全局色表和局部色表。全局色表于那些没有置局部色表的像起作用。全局色表的作用域是整个数据流。局部色表接在其后的单张图像起作用。色表都是可的。
/*
全局色表这东西是我们感兴趣的东西,它有点像png格式定义种的调色板,如果要修改gif图片的颜色,哈哈,修改这个全局色表就可以.如果有全局色表块,那么它一定从gif流的14个字节开始(头部6 + 逻辑视频描述块7)
*/
 
以下是各数据块的说明,如果注明为版本89a的话,则说明这个数据块不会在87a版的协议中出现.
 
(6个字节)
              标识() ---GIF
       版本()   ---87a (or 89a)
 
逻辑视屏描述
              逻辑屏幕(2)
              逻辑屏幕高(2)
              Packed Fields (1)
              背景色索引(1)
              象素高(1)
Packed Fields说明:
全局色表 1 Bit
色方案 3 Bits
 1 Bit
全局色表尺寸 3 Bits
解释:
              背景色索引 - 背景色指向全局色表。背景色是指那些没有背像覆盖的屏部分的色。若全局色表志位置0则该字段也被0,并且被忽略。
象素高 - 用于算原像中像素的近似高比。如果字段的值为0象素的高比由下面的公式
 = (象素高 + 15) / 64
字段的取从最的比41到最高的比14增的1/64
 0 - 没有比1255 - 用于算的
全局色表 - 指示有没有全局色表,如果该标志位置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>
长时间(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)
       (2)
       <Packed Fields>(1)
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.

转载:http://blog.csdn.net/kesalin/article/details/1189075