gif图片格式解析

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 - 用于 算的
全局色表 - 指示有没有全局色表,如果 该标 志位置 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.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值