2024年6月4日发(作者:)
GIF标准及其解码
GIF(Graphics Interchange Format)是CompuServe公司开发的图像文件存储格式,1987年开
发的GIF文件格式版本号是GIF87a,1989年进行了扩充,扩充后的版本号定义为GIF89a。
一, 概述:
GIF文件由文件头,描述块,彩色表,数据块,扩展块和结束符构成,GIF87a和GIF89a
的区别在于:后者较前者增加了扩展块,从功能上看即提供了对透明色和多帧动画的支
持。
二, 格式详解:
约定:
i: 以下图示括号中出现的“B”代表字节(Byte),而“b”则代表字节中的位(bit)。
ii:两个字节以上数的存放顺序为低字节在前。
iii:文件格式中出现的大小尺寸等均为unsigned数据类型,单位为字节或像素。
iv:各描述结构块以在文件中出现的先后顺序而排列。
v:符号约定:*表示名词解释 ,#表示效果演示 ,【】表示参考文献。
1,Header结构:
Signature(3B)Version(3B)
说明:Signature 为“GIF”3个字符;Version 为“87a”或“89a”3个字符。
2,Logical Screen Descriptor结构:
Logical Screen
Width(2B)
Logical Screen
Depth(2B)
Packet
fields(1B)
Background
Color Index(1B)
Pixel Aspect
Ratio(1B)
Global Color
Table Flag(1b)
Color
Resolution(3b)
Sort
Flag(1b)
Global Color Table
Size(3b)
说明:Logical Screen Width 和Logical Screen Depth 均以像素为单位。
Packet fields 中最高位为全局颜色表标志,即为1时表明Logical Screen
Descriptor后面跟的是全局颜色表。
Color Resolution 的值加1代表颜色表中每种基色用多少位表示,如为“111”时
表示每种基色用8位表示,则颜色表中每项为3Byte。由于该值
有时可为0,一般在解码程序中,该3位不作处理,而直接由Global
Color Table Size 算出颜色表大小。
Sort Flag 表示重要颜色排序标志,标志为1时,表示颜色表中重要的颜色排在
前面,有利于颜色数较少的解码器选择最好的颜色。一般该标志为0,
不作处理。
Global Color Table 的值加1作为2的幂,算得的数即为颜色表的项数,实际上
颜色表每项由RGB三基色构成,每种基色占一个字节,则颜色表占字
节数为项数的3倍。由于最大值为“111”,故颜色表的项数最多为256
项,即256种颜色,8位每基色则颜色表大小为768 Bytes。
Note:“256种颜色”是指这256种颜色是编码器在由24位原始位图数据生成
GIF文件时从262K色中选取的,生成的图像一样可以很鲜艳#。
Background Color Index 表示背景颜色索引值*。可以这样理解:在指定大小显示
区,GIF图像的大小可能小于显示区域大小,显示区中剩余的区域则
一律用背景颜色索引值在全局颜色表中对应的颜色填充。在实际解码
过程中,在显示图像之前可将显示区域全部用该颜色填充。
*颜色索引值:颜色索引值是一个在颜色表中的序号值,即该序号对应的颜色值。
Pixel Aspect Ratio 表示像素宽高比,一般为0,不作处理,直接以Logical Screen 宽
和高作处理。如该项不为0,则参照GIF89a标准【1】计算。
3,Global Color Table 结构:
Red 0Green 0Blue 0Red 255Green 255
Blue 255
颜色表每项由3原色RGB表示,依次排放,大小由前面的Logical Screen Descriptor
决定。一般GIF图像用256色,每种基色用8位,则有768个字节大小的颜色表。
4,Image Descriptor 结构:
Image
Separator(1B)
Image
Left position(2B)
Image
Top position(2B)
Image
Width(2B)
Image
Depth(2B)
Packet
Fields(1B)
Local Color
Table Flag(1b)
Interlace
Flag(1b)
Sort
Flag(1b)
Reserved
(2b)
Local Color Table
Size(3b)
Image Separator 固定为0x2C(ASCII码中代表“,”)。
Image Left position + Image Top position 表示Image Descriptor 后面跟的一幅图像(块)
起始点相对(逻辑)屏幕原点(令其为最左上角点)的位移。
Image Width + Image Depth 表示Image Descriptor 后面跟的一幅图像(块)的实际宽
和高,不应该超过Logical Screen Width 和Logical Screen Depth的大小。
以上四项信息在显示多帧图像(动画)时尤其要注意,因为每帧更新的区域有可能都
不一样#。
Local Color Table Flag 局部颜色表标志,为1时表示Image Descriptor后面跟的是下幅
图像所用的颜色表,此时Global Color Table(全局颜色表)无效。
Note:对于GIF中的一幅图像,可能只有全局颜色表(如静态图像,GIF87a图像
和大部分多帧动画),可能没有全局颜色表而每幅图像有各自的局部颜色表(GIF
电影片断动画较常见),可能两种颜色表都有(即为上面考虑的情况),也可能两种
颜色表都没有(此种情况要用系统颜色表,本文不作考虑)。
Interlace Flag 交错显示标志,为1时表示图像数据是以隔行方式存放的。最初GIF标
准设置此标志的目的是考虑到通信设备间传输速度不理想情况下,用这
种方式存放和显示图像,就可以在图像显示完成之前看到这幅图像的概
貌,慢慢的变清晰,而不觉得显示时间过长。具体扫描行顺序参见GIF89a
标准【1】。作为单机显示系统来讲,可以采取逐次行显示方式,也可以
采取逐次全屏显示方式(此时将看不到交错效果),依据显示系统的刷新
显示性能,解码程序设计者可以选择权衡的。
Sort Flag 与Global Color Table中Sort Flag含义相同。
Reserved 保留。
Local Color Table Size 局部颜色表大小,计算方法与Global Color Table中的方法一致。
5,Local Color Table 结构:
与Global Color Table 结构一致,因而处理方式也与后者一样。要注意的是,遇到
发布评论