gif图片格式解析
飘飘白云整理
参考:
网络中文gif资料
简介:
GIF(Graphics Interchange Format)是CompuServe公司开发的图像文件存储格式,1987年开发的GIF文件格式版本号是GIF87a,1989年进行了扩充,扩充后的版本号定义为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之外,0x00~0x7f用于成象块;0x80~0xf9用于控制块;0xfa~0xff用于特殊用途块。解码器通过识别块标记来处理块的作用域。
解释:
色表- gif格式利用色表来显示基于光栅的图像。色表分为全局色表和局部色表。全局色表对于那些没有设置局部色表的图像起作用。全局色表的作用域是整个数据流。局部色表对于紧接在其后的单张图像起作用。这两种色表都是可选的。
/*
全局色表这东西是我们感兴趣的东西,它有点像png格式定义种的调色板,如果要修改gif图片的颜色,哈哈,修改这个全局色表就可以.如果有全局色表块,那么它一定从gif流的14个字节开始(头部6个 + 逻辑视频描述块7个)。
*/
以下是各数据块的说明,如果注明为版本89a的话,则说明这个数据块不会在87a版的协议中出现.
头部(6个字节)
标识符(3 字节) ---GIF
版本(3 字节) ---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
该字段的取值范围从最宽的比值4:1到最高的比值1:4,递增的步幅为1/64。
取值: 0 - 没有比值,1~255 - 用于计算的值。
取值: 0 - 没有比值,1~255 - 用于计算的值。
全局色表标志 - 指示有没有全局色表,如果该标志位置1,则全局色表会紧接在该块之后出现。该位也用于解释是否选用背景颜色索引字段。若该位置1,则背景颜色索引字段的值将指向背景颜色表。
色彩方案 - 提供给原始图像的每个颜色的位数减1。这个值代表图像中所使用的整个调色板的大小,而不是图像中所使用的颜色的数量。例如,若该字段的值为3,则图像中所使用的调色板的每个色值占4位。
短标志 - 表明全局色表是否被排序。如果该位置1,则全局色表按照重要性递减的原则进行了排序。典型地,是按照颜色的使用频度进行递减排序,使用频度最高的颜色排在色表的最前面。这样便可帮助解码器选择最好的颜色子集来成象。
全局色表的尺寸 - 如果全局色表标志位置1,则该字段的值记录全局色表中所占用的字节数。
全局色表
该块包含一个按照字节顺序表示红-绿-蓝三元色的色表。全局色表用于那些没有局部色表的图像和纯文本扩充。在逻辑视屏描述块中的全局色表标志位置1时表示有全局色表。全局色表紧接在逻辑视屏描述块之后,占用的字节数为:
3*2^(全局色表尺寸+1)
数据组成格式为:
Red 0
Green 0
Blue 0
……
Red n