移动 前端 Python Android Java

Android external giflib 浅析理论

2020-10-20  本文已影响0人  zcwfeng

gif 文件格式

GIF(Graphics Interchange Format,图形交换格式)文件是由 CompuServe公司 开发的图形文件格式,版权所有,任何商业目的使用均须 CompuServe公司授 权。

GIF文件结构

GIF文件内部是按块划分的,包括控制块( Control Block )和数据块(Data Sub-blocks)两种。控制块是控制数据块行为的,根据不同的控制块包含一些不 同的控制参数;数据块只包含一些8-bit的字符流,由它前面的控制块来决定它 的功能,每个数据块大小从0到255个字节,数据块的第一个字节指出这个数据 块大小(字节数),计算数据块的大小时不包括这个字节,所以一个空的数据块 有一个字节,那就是数据块的大小0x00。

一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF Data Stream)和 文件终结器(Trailer)三个部分。文件头包含GIF文件署名(Signature)和版本号 (Version);GIF数据流由控制标识符、图象块(Image Block)和其他的一些扩展块 组成;文件终结器只有一个值为0x3B的字符(';')表示文件结束。下表显示了一 个GIF文件的组成结构:

Gif文件格式.png

GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组 成:"GIF";文件版本号也是由三个字节组成,可以为"87a"或"89a".
Gif文件的版本号:
87a--代表1987年5月
89a--含义1989年7月

逻辑屏幕标识符(Logical Screen Descriptor)

逻辑屏幕标识符.png

背景颜色索引 - 为背景颜色指向全局色表。背景颜色是指那些没有被图像覆盖的 视屏部分的颜色。若全局色表标志位置为0,则该字段也被赋值0,并且被忽略。

象素高宽比 - 用于计算原图像中像素的近似高宽比。如果该字段的值为非0,则 象素的高宽比由下面的公式计算: 高宽比 = (象素高宽比 + 15) / 64 该字段的取 值范围从最宽的比值4:1到最高的比值1:4,递增的步幅为1/64。取值: 0 - 没 有比值,1~255 - 用于计算的值。

全局色表标志 - 指示有没有全局色表,如果该标志位置1,则全局色表会紧接在 该块之后出现。该位也用于解释是否选用背景颜色索引字段。若该位置1,则背 景颜色索引字段的值将指向背景颜色表。

色彩方案 - 提供给原始图像的每个颜色的位数减1。这个值代表图像中所使用的 整个调色板的大小,而不是图像中所使用的颜色的数量。例如,若该字段的值为 3,则图像中所使用的调色板的每个色值占4位。

短标志 - 表明全局色表是否被排序。如果该位置1,则全局色表按照重要性递减 的原则进行了排序。典型地,是按照颜色的使用频度进行递减排序,使用频度最 高的颜色排在色表的最前面。这样便可帮助解码器选择最好的颜色子集来成象。

全局色表的尺寸 - 如果全局色表标志位置1,则该字段的值记录全局色表中所占 用的字节数。

全局颜色列表(Global Color Table)

必须紧跟在逻辑屏幕标识符后面,每个颜色列表索引条目由三个字节组成,按图象标识符(Image Descriptor)包含处理一个基于图像的表的必要参数,它是一 幅图所必需的,图象标识符以0x2C(',')字符开始。一幅图像对应一个图象标识 符,图象标识符后面跟着对应的图像数据。

全局颜色列表.png

局部颜色列表(Local Color Table)

如果上面的局部颜色列表标志置位的话,则需要在这里(紧跟在图象标识符之 后)定义一个局部颜色列表以供紧接着它的图象使用,注意使用前应线保存原来 的颜色列表,使用结束之后回复原来保存的全局颜色列表。如果一个GIF文件即 没有提供全局颜色列表,也没有提供局部颜色列表,可以自己创建一个颜色列 表,或使用系统的颜色列表。局部颜色列表的排列方式和全局颜色列表一样: RGBRGB......
图形控制扩展(Graphic Control Extension)
这一部分是可选的(需要89a版本),可以放在一个图象块(图象标识符)或文本 扩展块的前面,用来控制跟在它后面的第一个图象(或文本)的渲染(Render)形 式,组成结构如下:

局部颜色列表.png

扩充引入 - 用于识别一个扩充块的开始,该字段为固定值0x21。 图像控制标号 - 识别当前块是否为图形控制扩充。该字段为固定值 0xF9。 块尺寸 - 块中所包含 的字节数。从块尺寸字段开始到快结束符(不含结束符)。该字段包含固定值 4。 配置方法 - 指示图像显示后的处理方法。值: 0 - 无指定的配置,解码器不需 要做任何处理。 1 - 不做配值。图像将被留在原位置。 2 - 恢复背景颜色。图像 所占的区域必须备恢复为背景颜色。 3 - 恢复以前的颜色。解码器需要将图像区 域恢复为原来成象的颜色。 4-7 - 未定义。 用户输入标志 - 说明在继续处理之前 是否需要用户输入。可以和输入延时一起使用。 透明标志 - 表明在透明索引字 段是否给定透明索引。 延时 - 如果不为0, 该字段指定以1/100秒为单位的时延 数。 透明索引 - 如果遇到透明索引,则显示设备的相关象素不被改变,继续处 理下一个象素。 块终止符 - 这个0长度字段标志着图像控制扩充得结束。
基于颜色列表的图象数据(Table-Based Image Data),由两部分组成:LZW编码 长度(LZW Minimum Code Size)和图象数据(Image Data)。

LZW压缩算法在GIF中的应用

GIF图象数据使用了LZW压缩算法(详细介绍请看后面的『LZW算法和GIF数据 压缩』),大大减小了图象数据的大小。图象数据在压缩前有两种排列格式: (由图象标识符的交织标志控制)。连续方式按从左到右、从上到下的顺序排列 图象的光栅数据;交织图象按下面的方法处理光栅数据:

创建四个通道(pass)保存数据,每个通道提取不同行的数据: 第一通道(Pass 1) 提取从第0行开始每隔8行的数据; 第二通道(Pass 2)提取从第4行开始每隔8行的 数据; 第三通道(Pass 3)提取从第2行开始每隔4行的数据; 第四通道(Pass 4)提 取从第1行开始每隔2行的数据;

通道.png

userdata

相当于字节一个缓存的东西

giflib 源码获取

android源代码

找到external/giflib扩展库源代码

官网 获取:

git clone https://git.code.sf.net/p/giib/code giib-code

实现参见我的代码

上一篇下一篇

猜你喜欢

热点阅读