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 个字节 )
               标识 ( ) ---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
字段的取 从最 的比 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>
长时间 ( 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.

你可能感兴趣的:(gif图片格式解析)