返回首页

Gif图片格式完全理解

时间:2016-12-02 19:59来源:知行网www.zhixing123.cn 编辑:麦田守望者

Gif格式标准主要有87a和89a两个版本。

Gif由一个个的block组成,按照我的理解可以将Gif图数据分为两个部分,一个部分为头部,包含了Header(Gif的识 别),Logical Screen Descriptor(描述Gif图展示的逻辑屏幕的参数),Global Color Table(全局的调色板,这个为可选)。之后就是数据主体部分,可以是图像的数据以及各种扩展块。

介绍分为两个部分,一个部分是Gif中比较通用的一些数据组织形式介绍,一个部分是Gif图的数据块的介绍。

一下如果没有特殊说明,就是87a标准中就有的,有特殊说明,为89a标准中才出现的,主要为各种扩展块。

通用的数据组织形式

Data Sub-blocks 数据子块

数据子块是包含数据的单元,它们没有一个标签(label)。无论在何种格式中指定数据块,这些块在控制块的上下文中进行处理。数据子块的第一个字 节标识了跟随的数据字节的数量,一个数据子块能够包含0到255数据字节,块的大小并不包含指定大小的字节本身。空的子块指定大小的字节包含着0x00。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Block Size Byte
+---------------+
1 | |
+- -+
2 | |
+- -+
3 | |
+- -+
| | Data Values Byte
+- -+
up | |
+- . . . . -+
to | |
+- -+
| |
+- -+
255 | |
+---------------+

Block Terminator 块的终结标识

这个数据子块用来终结一系列的数据子块,其包含一个单独的字节指示块的大小为0,之后并不包含其它数据。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Block Size Byte
+---------------+

数据块

数据块分为四个部分介绍,第一部分为文件头和紧密跟随着文件头的相关数据块;第二部分为和数据流中图像相关的数据块;第三部分为各种扩展。最后一个部分为文件尾。

Header及Header相关

Header(文件头)

Header标识了文本中的GIF数据流,Signature字段标记了数据流的开始,Header字段是必须的,Header定义如下:
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Signature 3 Bytes
+- -+
1 | |
+- -+
2 | |
+---------------+
3 | | Version 3 Bytes
+- -+
4 | |
+- -+
5 | |
+---------------+

依次为
1.3 Bytes Signature: “GIF”三个字节
2.3 Bytes Version: 版本号 “87a” “89a”等

Logical Screen Descriptor

Logical Screen Descriptor包含了描述了在设备上呈现图像区域所需的参数。Logical Screen Descriptor字段是必须的,并且必须紧跟在Header后面。Logical Screen Descriptor定义了依次为:
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Logical Screen Width Unsigned
+- -+
1 | |
+---------------+
2 | | Logical Screen Height Unsigned
+- -+
3 | |
+---------------+
4 | | | | | <Packed Fields> See below
+---------------+
5 | | Background Color Index Byte
+---------------+
6 | | Pixel Aspect Ratio Byte
+---------------+
1.Unsigned(2字节) Logical Screen Width 宽度,单位为像素
2.Unsigned(2字节) Logical Screen Height 高度,单位为像素
3.Packed Fields(1字节) 1.1 Bit Global Color Table Flag
2.3 Bits Color Resolution
3.1 Bit Sort Flag
4.3 Bits Size of Global Color Table

4.1 Byte Background Color Index
5.1 Byte Pixel Aspect Ratio

描述一下一些字段的意思:
1.Global Color Table Flag 描述是否存在Global Color Table的标识,值分别为 1.0 – 不会在Logical Screen Descriptor后面跟随着Global Color Table, Background Color Index字段也就没有意义
2.1 – 在Logical Screen Descriptor后面跟随着Global Color Table,Background Color Index也就有意义

2.Color Resolution:数值为原始图像的原色的位数减去1。这个值代表了整个调色板的大小,并不是图像中实际使用的颜色数量。例如若这个值为3,代表原始图像的调色盘每个原色有4位。
3.Sort Flag 标识Global Color Table是否根据重要性递减被排序过了,数值分别为 1.0 – 没有排序过
2.1 – 递减排序,最重要的颜色优先

4.Size of Global Color Table:如果Global Color Table Flag为1,这个字段的值用来统计Global Color Bytes中的byte数。即使没有指定全局颜色表,根据上述公式设置此字段,以便解码器可以选择显示流的最佳图形模式。(该字段由字节的3个最低有效位 组成)。
5.Background Color Index 背景颜色在Global Color Table中的索引。背景颜色用于被没被图像覆盖的区域的像素。如果Global Color Table Flag是0,这个字段应为0并且被忽视。
6.Pixel Aspect Ratio:用于计算原始图像中像素的宽高比的近似值。如果这个字段为0,则根据以下公式计算宽高比的近似值:
Aspect Ratio = (Pixel Aspect Ratio + 15) / 64
Pixel Aspect Ratio:像素的宽和高的商,这个值范围允许以1/64的增量从4:1到1:4

Global Color Table

该块包含一个color table,是一系列的bytes代表红-绿-蓝三原色。Global Color Table 用于没有Local Color Table(见后面介绍)或者Plain Text Extensions(见后面介绍)的图像。

只有在Logical Screen Descriptor中间的Global Color Table Flag为1的时候Global Color Table才存在,如果存在,其必须紧跟着Logical Screen Descriptor,其包含的bytes数量为
3*2^(Size of Global Color Table+1)
(Size of Global Color Table为Logical Screen Descriptor中间的字段)。

在每个数据流中最多只有一个Global Color Table。语法例子如下为:
7 6 5 4 3 2 1 0 Field Name Type
+===============+
0 | | Red 0 Byte
+- -+
1 | | Green 0 Byte
+- -+
2 | | Blue 0 Byte
+- -+
3 | | Red 1 Byte
+- -+
| | Green 1 Byte
+- -+
up | |
+- . . . . -+ ...
to | |
+- -+
| | Green 255 Byte
+- -+
767 | | Blue 255 Byte
+===============+

数据流中的图像

Image Descriptor

每个在数据流中的图像包含一个Image Descriptor,一个可选的Local Color Table,和图像数据。每个图像必须适应逻辑屏幕的边界。

Image Descriptor包含处理基于表的图像所需的参数,其中的坐标指的是在逻辑屏幕内的坐标,像素为单位。这个块是图像渲染块,可能在一个或者多个控制块 例如Graphic Control Extension之前,可能会有一个Local Color Table跟随其后。Image Descriptor之后总是会有图像数据。

对于一张图像该块是必须的,数据流中的每张图像有且仅有一个Image Descriptor。数据流中的图像数量没有限制。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Image Separator Byte
+---------------+
1 | | Image Left Position Unsigned
+- -+
2 | |
+---------------+
3 | | Image Top Position Unsigned
+- -+
4 | |
+---------------+
5 | | Image Width Unsigned
+- -+
6 | |
+---------------+
7 | | Image Height Unsigned
+- -+
8 | |
+---------------+
9 | | | | | | <Packed Fields> See below
+---------------+

总共包含如下的字段:
1.1 Byte Image Separator
2.Unsigned(2字节)Image Left Position
3.Unsigned(2字节)Image Top Position
4.Unsigned(2字节)Image Width
5.Unsigned(2字节)Image Height
6.1 字节 Packed Fields 1.1 Bit Local Color Table Flag

顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
标签(Tag):Gif图片格式
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
猜你感兴趣