标签:长度 背景图像 分数 ini 程序 修改 整数 view cte
Gif格式标准主要有87a和89a两个版本。
Gif由一个个的block组成,按照我的理解可以将Gif图数据分为两个部分,一个部分为头部,包含了Header(Gif的识别),Logical Screen Descriptor(描述Gif图展示的逻辑屏幕的参数),Global Color Table(全局的调色板,这个为可选)。之后就是数据主体部分,可以是图像的数据以及各种扩展块。
介绍分为两个部分,一个部分是Gif中比较通用的一些数据组织形式介绍,一个部分是Gif图的数据块的介绍。
一下如果没有特殊说明,就是87a标准中就有的,有特殊说明,为89a标准中才出现的,主要为各种扩展块。
数据子块是包含数据的单元,它们没有一个标签(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 | |
+---------------+
这个数据子块用来终结一系列的数据子块,其包含一个单独的字节指示块的大小为0,之后并不包含其它数据。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Block Size Byte
+---------------+
数据块分为四个部分介绍,第一部分为文件头和紧密跟随着文件头的相关数据块;第二部分为和数据流中图像相关的数据块;第三部分为各种扩展。最后一个部分为文件尾。
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 | |
+---------------+
依次为
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
+---------------+
描述一下一些字段的意思:
该块包含一个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,一个可选的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
+---------------+
总共包含如下的字段:
具体介绍为:
扩展和范围:这个块的范围包括跟随在其后的Table Based Color Image Data Block,这个块可能被Graphic Control Extension修改。
该块包含颜色表,和Global Color Table相似。Local Color Table如果存在(Local Color Table Flag为1),则紧跟在Image Descriptor后面,是一些列代表红-绿-蓝颜色的字节,字节数量为
3*2^(Size of Local Color Table+1)
如果存在,该颜色表暂时变为激活的颜色表,并且用其来处理跟随的图像数据
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
+===============+
扩展和范围:这个块的范围包括紧紧跟随着其的Table Based Image Data块,这个块不能够被任何扩展修改。
基于表的图像的数据包含一系列的子块。每个子块最多size为255字节,包含图像中每个像素到当前激活的颜色表的索引。像素的索引按照从左到右,从上到下的顺序进行。每个索引的值应该在活动颜色表的大小范围内,从0开始。索引序列使用可变长编码的LZW算法进行编码,如索引F中描述。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
| | LZW Minimum Code Size Byte
+---------------+
+===============+
| |
/ / Image Data Data Sub-blocks
| |
+===============+
LZW Minimum Code Size:这个字节决定了图像数据中的LZW码的初始字节数。
扩展和范围:这个块没有范围,其包含光栅数据。想要修改基于表的图像的扩展必须在其相关的Image Descriptor之前出现。
扩展主要在89a版本中引入,当然,我也遇到过变态的gif写着87a却用着扩展。
需要版本89a。
Graphic Control Extension包含在处理图像渲染块时候用到的参数。这个扩展的范围是跟随的第一张图像渲染块。扩展只包含一个数据子块。(graphic rendering block图像渲染块,我的理解是包含图像相关的数据块和Plain Text Extension)
这个块可选,在一个图像渲染块之前最多有一个Graphic Control Extension。这是在数据流中可能包含的唯一对Graphic Control Extension数量的限制。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Extension Introducer Byte
+---------------+
1 | | Graphic Control Label Byte
+---------------+
+---------------+
0 | | Block Size Byte
+---------------+
1 | | | | | <Packed Fields> See below
+---------------+
2 | | Delay Time Unsigned
+- -+
3 | |
+---------------+
4 | | Transparent Color Index Byte
+---------------+
+---------------+
0 | | Block Terminator Byte
+---------------+
这些字段作用如下:
作用范围:这个扩展的作用范围是跟随者其的图像渲染块,可能有其他的扩展出现在这个块和其目标之间。这个块能够修改Image Descriptor Block和Plain Text Extension。
推荐:
需求89a版本。
Comment Extension包含的文本信息并不是GIF数据流的实际图像中的一部分。它适合于包括图像,信用,描述或者其它任意类型的非控制,非图像信息的评论。Comment Extension可能被解码器忽略,或者被保存等待后续处理。任何情况下,Comment Extension不会打断或者干扰数据流的处理。
这个块可选,任何数量的Comment Extension都可以出现在数据流中。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Extension Introducer Byte
+---------------+
1 | | Comment Label Byte
+---------------+
+===============+
| |
N | | Comment Data Data Sub-blocks
| |
+===============+
+---------------+
0 | | Block Terminator Byte
+---------------+
介绍如下:
建议:
需要89a版本。
Plain Text Extension包含文本数据和需要的能够将这些数据渲染为图像的信息的简单格式。文本数据应当编码为7字节能够打印出来的ASCII字符。文本数据使用由块字段中的参数定义的字符单元网格来呈现。每个字符用一个单独的单元来渲染。快中的文本字符被渲染为单间隔字符,每个单元格一个字符,有最适合的字体和大小。从块的数据部分顺序地去除数据自负并在单元内呈现,从网格中的坐上单元开始并且从左到右并从上到下地进行。呈现文本数据,直到到达数据的末尾或者字符网格被填充完。在单元尺寸不允许非整数的时候,必须要丢弃分数单元。编码器必须要小心精确地指定网格单元,以避免这样的情况发生。
这个块需要Global Color Table存在,这个块使用的颜色来自流中的Global Color Table。如果其存在的话。这个块是一个图像渲染块,因此能够被一个Graphic Control Extension修改。这个块是可选的,任意数量的Plain Text Extension能够出现在数据流中。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Extension Introducer Byte
+---------------+
1 | | Plain Text Label Byte
+---------------+
+---------------+
0 | | Block Size Byte
+---------------+
1 | | Text Grid Left Position Unsigned
+- -+
2 | |
+---------------+
3 | | Text Grid Top Position Unsigned
+- -+
4 | |
+---------------+
5 | | Text Grid Width Unsigned
+- -+
6 | |
+---------------+
7 | | Text Grid Height Unsigned
+- -+
8 | |
+---------------+
9 | | Character Cell Width Byte
+---------------+
10 | | Character Cell Height Byte
+---------------+
11 | | Text Foreground Color Index Byte
+---------------+
12 | | Text Background Color Index Byte
+---------------+
+===============+
| |
N | | Plain Text Data Data Sub-blocks
| |
+===============+
+---------------+
0 | | Block Terminator Byte
+---------------+
介绍如下:
扩展和范围:这个块的范围是其中包含的Plain Text Data子块,看这个快可能被Graphic Control Extension修改。
建议:在Plain Text Extension中的数据假设是预格式化的。对于字体和大小的选择交给解码器来自由控制。如果遇到字符为小于0x20或者大于0xf7,编码器应当使用这样的网格和单元尺寸,单元能够水平或者垂直适应网格。为了尽可能地兼容,字符单元应当为大约8*8或者8*16(宽*高),考虑到非常规大小文本的图像。
需要89a版本。
Application Extension包含应用特定信息,它符合扩展块的语法。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | Extension Introducer Byte
+---------------+
1 | | Extension Label Byte
+---------------+
+---------------+
0 | | Block Size Byte
+---------------+
1 | |
+- -+
2 | |
+- -+
3 | | Application Identifier 8 Bytes
+- -+
4 | |
+- -+
5 | |
+- -+
6 | |
+- -+
7 | |
+- -+
8 | |
+---------------+
9 | |
+- -+
10 | | Appl. Authentication Code 3 Bytes
+- -+
11 | |
+---------------+
+===============+
| |
| | Application Data Data Sub-blocks
| |
| |
+===============+
+---------------+
0 | | Block Terminator Byte
+---------------+
介绍如下:
这个块是一个单字段的块,标识着GIF数据流的结束,其值为固定的0x3B。
7 6 5 4 3 2 1 0 Field Name Type
+---------------+
0 | | GIF Trailer Byte
+---------------+
为什么有的Gif图能够循环播放但是有的Gif图播放一次就结束了?这个在协议中并没有介绍,其实原因在于一种Application Extension – Netscape Looping Application Extension。
其形式为
+---------------+
0 | 0x21 | Extension Label
+---------------+
1 | 0xFF | Application Extension Label
+---------------+
2 | 0x0B | Block Size
+---------------+
3 | |
+- -+
4 | |
+- -+
5 | |
+- -+
6 | |
+- NETSCAPE -+ Application Identifier (8 bytes)
7 | |
+- -+
8 | |
+- -+
9 | |
+- -+
10 | |
+---------------+
11 | |
+- -+
12 | 2.0 | Application Authentication Code (3 bytes)
+- -+
13 | |
+===============+ --+
14 | 0x03 | Sub-block Data Size |
+---------------+ |
15 | 0x01 | Sub-block ID |
+---------------+ | Application Data Sub-block
16 | | |
+- -+ Loop Count (2 bytes) |
17 | | |
+===============+ --+
18 | 0x00 | Block Terminator
+---------------+
这些字段大部分已经是写死了,只有一个Loop Count可以调整,如果Loop Count为0x00,就意味着无限循环播放,否则可以按照这个Loop Count的数值播放指定的次数。
如果数据流中有这个Netscape Looping Extension就可以控制播放几次甚至无限循环播放了。所以修复Gif不能够无限循环播放的问题就在于:
标签:长度 背景图像 分数 ini 程序 修改 整数 view cte
原文地址:http://blog.csdn.net/shiroh_ms08/article/details/53347873