数字图像处理及应用:使用MATLAB分析与实现
上QQ阅读APP看书,第一时间看更新

2.5 图像文件格式

图像文件格式是记录和存储影像信息的格式。对数字图像进行存储、传输、处理,必须采用一定的图像格式,也就是把图像的像素按照一定的方式进行组织和存储,将图像数据存储为文件就成为图像文件。图像文件格式决定了图像文件的数据结构信息,以及文件如何与其他文件交换数据等。常见的图像格式文件包括BMP、JPEG、PNG、TIFF、GIF、RAW等。由于数字设备获取的图像文件一般都很大,而储存容量却有限,因此图像通常都会经过压缩再储存。

2.5.1 BMP文件

BMP是英文Bitmap(位图)的简写,即位图文件,是一种与硬件设备无关(device-independent Bitmap)的图像文件格式。BMP文件是Windows系统中的标准图像文件格式,被很多Windows应用程序支持。随着Windows系统的流行及应用程序的不断丰富,BMP位图格式得到了越来越广泛的应用。BMP文件采用位映射存储格式,其特点是包含的图像信息较丰富,除位图深度可选之外,不进行任何其他压缩,但由此也导致了它与生俱来的缺点是占用磁盘空间过大。BMP图像文件的深度可以选择1bit、4bit、8bit、24bit。采用该格式存储图像时,BMP图像的扫描按照从左到右、从下到上的顺序进行。

BMP图像文件格式一般由文件头信息块、图像描述信息块、颜色表(真彩图像无颜色表)和图像数据区四个部分组成,并以BMP为扩展名。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

1. BMP文件的组成

BMP文件由位图文件头、位图信息头、颜色信息(调色板数据)和位图数据共四个部分组成,如表2-2所示。

表2-2 BMP文件结构

2. BMP文件头

BMP文件头数据含有BMP文件的类型、文件大小和位图起始位置(相对于位图文件头的偏移量)等信息。FILEHEADER结构占14字节,其定义如下:

3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息,主要包括位图大小、像素深度、位图是否压缩等信息。位图信息头共占40字节,其定义如下:

对于BMP格式的图像文件,无论文件尺寸的大或小,都不会对数据进行任何压缩处理。如果位图文件采用压缩格式,则16色位图采用RLE-4压缩算法,256色位图采用RLE-8算法。

4. 颜色表

颜色信息包含本图像用到的颜色表,显示图像时需要用该颜色表来生成调色板。如果图像为RGB真彩色图像,图像的每一像素用24bit表示,这时图像文件中没有颜色表信息块。颜色表用于说明位图中的颜色,它有若干个表项,每一个表均是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

颜色表RGBQUAD结构数据的个数由biBitCount来确定。当biBitCount=1,4,8时,分别有2,16,256个颜色表项;当biBitCount=24时,为真彩色图像,每个字节分别对应R、G、B值,此时图像无颜色表项。在BMP文件的颜色信息表RGBQUARD结构中增加了一个保留字段rgbReserved,它不代表任何颜色信息,但必须取固定值0。

根据上述RGBQUARD结构对颜色信息的定义,红、绿、蓝排列顺序与一般真彩色图像文件的颜色排列顺序正好相反。即一个位图中某一像素点的颜色为“FF、00、00、00”,则表示该点为蓝色,而不是红色。

位图信息头和颜色表组成位图信息BITMAPINFO数据结构,BITMAPINFO结构定义如下:

5. 位图数据

BMP文件中的位图数据表示图像对应的像素值。位图数据记录了位图的每一个像素值,图像像素值的记录顺序在扫描行内是从左到右,在扫描行之间是从下到上。即BMP文件首先存放的是图像的最后一行像素,最后存储图像的第一行像素值,对于同一行之间的像素值,则按照先左边后右边的顺序存储。

位图的一个像素值所占的字节数:

当biBitCount=1时,8个像素占1字节;

当biBitCount=4时,2个像素占1字节;

当biBitCount=8时,1个像素占1字节;

当biBitCount=24时,1个像素占3字节,按顺序分别为B、G、R值。

Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足则以0填充,位图每一扫描行的字节数:

DataSizePerline=(bi.biWidth×bi.biBitCount+31)/8

位图数据的大小:DataSizePerline×biHeight

若BMP文件起始部分数据如下:

424D 46900000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100∗1000 0300 0000 0090 0000 A00F 0000 A00F0000 0000 00000000 0000∗00F8 E007 1F00 0000∗02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2…

其中,1~14字节为图像文件头,数据所表示的含义分别如下。

(1)1、2:(这里的数字代表的是字节,下同)图像文件头。0x4d42='BM',即BMP格式。

(2)3~6:整个文件大小。4690 0000,即00009046h=36934。

(3)7、8:保留,必须设置为0。

(4)9、10:保留,必须设置为0。

(5)11~14:从文件开始到位图数据之间的偏移量(14+40+4∗2^biBitCount))(在有颜色板的情况下)。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。

15~54为位图信息头数据,数据含义如下。

(6)15~18:位图信息头长度。

(7)19~22:位图宽度,以像素为单位。8000 0000,为00000080h=128。

(8)23~26:位图高度,以像素为单位。9000 0000,为00000090h=144。

(9)27、28:位图的位面数,该值总是1。0100,为0001h=1。

(10)29、30:每一像素的位数。1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。

(11)31~34:压缩信息说明,即0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。

(12)35~38:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于一行所占的字节数×位图高度。0090 0000为00009000h=80×90×2h=36864。假设位图是24位,宽为41,高为30,则该数值=(biWidth∗biBitCount+31)/32∗4∗biHeight,即=(41∗24+31)/32∗4∗30=3720。

(13)39~42:水平分辨率,像素/米。A00F 0000为0000 0FA0h=4000。

(14)43~46:垂直分辨率,像素/米。A00F 0000为0000 0FA0h=4000。

(15)47~50:位图使用的颜色索引数。设为0,则说明使用所有调色板项。

(16)51~54:对图像显示有重要影响的颜色索引的数目。若为0,则表示所有颜色都重要。

2.5.2 JPEG文件

JPEG格式是一种常用的图像文件格式,其文件后缀名为.jpeg或.jpg,它是Joint Photographic Experts Group(联合图像专家组)的英文缩写。JPEG格式是一个比较成熟的图像有损压缩格式,能将图像数据压缩到很小的存储空间并保持较好的图像质量。也就是说,虽然图像存储为JPEG格式会有一些信息损失,但人眼很难分辨出压缩前后图像质量的差别。JPEG图像存储格式既满足了视觉系统对色彩和分辨率的要求,又在图像的清晰度和文件大小的选择上找到了一个很好的平衡点。

JPEG格式是一种灵活的图像文件格式,具有调节图像质量的功能,它允许采用不同的压缩比对图像进行压缩。根据对图像质量的要求,JPEG格式的压缩比通常为10:1~40:1。压缩比越小,图像质量越高;反之,压缩比越高,图像质量越差。JPEG文件被压缩的数据主要是高频信息,能较好地保护低频信息,同时也能较好地保护彩色信息,适应于连续色调的图像保存。

随着多媒体技术的应用越来越广泛,传统的JPEG压缩算法的缺点和不足越来越明显地表现出来。例如,若被压缩的图像中具有大片近似的色彩信息时,用JPEG压缩算法就容易产生马赛克效应,因此,当对图像的质量要求较高时,传统的JPEG压缩算法可能达不到要求。为了满足新的应用需求,专家组对JPEG格式进行了改进,推出了JPEG 2000标准,新的压缩算法最大的特点是将传统JPEG压缩算法中的首选DCT算法改为了首选小波变换压缩算法。JPEG 2000具有以下4个特点:

(1)压缩比高。与传统的JPEG压缩算法相比,JPEG 2000的压缩比提高了20%~30%。

(2)同时支持有损压缩和无损压缩,误差稳定性好,图像的质量更好。

(3)渐进传输。网络下载图像时,JPEG 2000按块传输,有助于快速浏览网络信息,提高了网络下载的速度。

(4)支持感兴趣的ROI,能制定ROI,可单独对ROI进行压缩和解压操作。

JPEG图像文件结构定义了一些列标记用于区分和识别图像数据及其相关信息,每一个标记由2字节组成,并规定前一个字节是0xFF,每个标记前还可添加若干0xFF字节,且数量不限。JPEG格式的8个重要标记如下。

(1)SOI 0xD8:图像开始。

(2)APP0 0xE0:APP0段主要存储图片的识别信息(字符串“JFIF\0”),包括APP0的长度、标识符、版本号、XY的密度单位(units为0表示无单位;units为1表示密度单位为“点数/英寸”;units为2表示密度单位为“点数/cm”;),X方向像素密度,Y方向像素密度,缩略图水平像素数目,缩略图垂直像素数目及缩略图RGB位图信息等。

(3)APPn 0xE1~0xEF:其他应用数据块,包括APPn的长度等信息。

(4)DQT 0XDB:包括量化表、量化表长度和量化表数目等。颜色可分为RGB三个分量,但在JPEG文件的RGB色彩格式需要先转化为YUV的格式。Y分量代表亮度信息,U、V分量代表色差信息。通常人眼对于Y分量更为敏感,量化表正是基于这一原理进行信息压缩的。

(5)SOF0 0xC0:图像大小、每个像素的位数及YUV每个分量的采样信息等。即图像数据帧的开始,包括帧开始长度与精度、每个颜色分量、像素位数、图像高度与宽度、颜色分量数、每个颜色分量的ID、垂直方向的样本因子、水平方向的样本因子、量化表号等。

(6)DHT 0xC4:定义Huffman表,包括表的长度、类型、直流或交流量表、索引、位表和值表。

(7)SOS 0xDA:扫描线开始。包括扫描开始长度、颜色分量数、直流系数表号、交流系数表号、缩略图数据等。

(8)EOI 0xD9:图像全部数据结束。

JPEG文件格式更深入的了解可参考第9章中关于JPEG标准的相关介绍。

2.5.3 PNG文件

PNG图像文件存储格式即可移植网络图形格式(portable network graphic format, PNG),是一种位图文件(bitmap file)存储格式。PNG用于存储灰度图像时,灰度图像的深度可达16位;存储彩色图像时,彩色图像的深度可达48位,并且还可存储多到16位的α通道数据。PNG采用从LZ77派生的Zlib无损数据压缩算法,压缩比高,生成文件容量小,一般应用于Java程序或网页。

1. PNG文件的特点

PNG文件具有以下特点:

(1)体积小。网络通信中因带宽制约,在保证图片清晰、逼真的前提下,网页上不可能大范围地使用文件较大的bmp格式文件。

(2)无损压缩。PNG文件采用LZ77算法的派生算法进行压缩,可获得高的压缩比。其编码方法可标记重复出现的数据,因而对图像的颜色没有影响,也不会产生颜色的损失,因此可以重复保存而不降低图像质量。

(3)索引彩色模式。PNG-8格式与GIF图像类似,采用8位调色板将RGB彩色图像转换为索引彩色图像。图像中保存的不再是各个像素的彩色信息,而是从图像中挑选出来的具有代表性的颜色编号,每一编号对应一种颜色,图像的数据量也因此减少,这对彩色图像的传输非常有利。

(4)优化的网络传输性。PNG图像在浏览器上采用流式浏览,图像即使经过交错处理,在完成下载之前,可提供一个基本的图像内容,然后再逐渐显示出清晰图像。它允许连续读出和写入图像数据,这个特性很适合在通信过程中显示和生成图像。

(5)支持透明效果。PNG可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘,这一功能是GIF和JPEG没有的。

(6)PNG同时还支持真彩和灰度级图像的Alpha通道透明度。

2. PNG文件结构

PNG文件整体上由PNG文件标志(PNG file signature)和数据块(chunks)两部分构成。即PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名域和按照特定结构组织的3个以上的数据块组成。文件的数据块部分一般由3个以上的PNG的数据块按照特定的顺序组成,因此,一个标准的PNG文件结构应该如图2-9所示。

图2-9 标准的PNG文件结构

1)PNG文件标志

PNG文件署名域由8字节的数据组成,用于识别该文件是否PNG文件。该域的值如表2-3所示。

表2-3 PNG文件署名域的值

其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件处理。

2)PNG数据块

PNG定义了两种类型的数据块:一种称为关键数据块(critical chunk),这个标准数据块是必需的;另一种称为辅助数据块(ancillary chunks),是可选数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也需支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

表2-4所示是PNG数据块类别(关键数据块部分用深色背景加以区分)。

表2-4 PNG文件格式中的数据块

为简单和方便,假设在本节所使用的PNG图像文件中,这4个数据块按表2-4所示的先后顺序进行存储,并且只出现一次。

(1)数据块结构。PNG文件中,每个数据块由4个部分组成,如表2-5所示。

表2-5 PNG数据块的结构

CRC(cyclic redundancy check)域中的数据是对chunk type code域和chunk data域中的数据进行计算得到的,CRC算法在ISO 3309和ITU-T V.42中定义。

(2)IHDR。文件头数据块IHDR(header chunk)包含有PNG文件中存储的图像数据的基本信息,并作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

文件头数据块由13字节组成,它的格式如表2-6所示。

表2-6 文件头数据块的组成

(3)PLTE。调色板数据块PLTE(palette chunk)包含与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且应置于图像数据块(image data chunk)之前。

PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成,如表2-7所示。

表2-7 调色表信息表

因此,调色板的长度是3的倍数,否则是一个非法的调色板。对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4,调色板的颜色数为16),否则将导致PNG图像不合法。

真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

(4)IDAT。图像数据块IDAT(image data chunk)用于存储PNG图像的灰度数据,在数据流中可包含多个连续顺序的图像数据块。

(5)IEND。图像结束数据IEND(image trailer chunk)用于标记PNG文件或者数据流已经结束,并且必须放在文件的尾部。PNG文件总是以“00 00 00 00 49 45 4E 44 AE 42 60 82”12个字符结束。这是因为根据数据块结构的定义,IEND数据块的长度总是0(00 00 00 00),数据标识为IEND(49 45 4E 44),因此,CRC码是AE 42 60 82。

2.5.4 TIFF文件

TIFF即标签图像文件格式(tagged image file format),以.tif为扩展名,是一种主要用于存储包括照片和艺术图片在内的图像的文件格式。它最初由Aldus和微软一起为PostScript打印而开发。TIFF格式支持256色、24位真彩色、32位、48位等多种色彩位,同时支持RGB、CMYK及YCbCr等多种彩色模式,并支持多平台。TIFF文件可以不压缩(文件较大)也可以压缩,支持RAW、RLE、LZW、JPEG、CCITT 3组和4组等多种压缩方式,用Photoshop编辑的TIFF文件可以保存路径和图层,绝大多数图像系统都支持这种格式。

TIFF在业界得到了广泛的支持,如Adobe公司的Photoshop、Jasc的GIMP、Ulead PhotoImpact和Paint Shop Pro等图像处理应用、QuarkXPress和Adobe InDesign桌面印刷和页面排版应用,扫描、传真、文字处理、光学字符识别和一些其他应用等都支持该格式。TIFF与JPEG和PNG一起成为流行的高位彩色图像格式,TIFF文件是最复杂的一种位图文件格式,它广泛应用于对图像质量要求较高的图像存储与转换。由于TIFF格式结构灵活、包容性大,因此已成为图像文件格式的一种标准。

TIFF最初的目的是为20世纪80年代中期桌面扫描仪厂商避免每商家都使用自己的格式而达成的一个公用统一的扫描图像文件格式。当时的桌面扫描仪只能处理二值图像,因此初期TIFF也只是二值图像格式,随着扫描仪的功能越来越强大,TIFF逐渐支持灰度图像和彩色图像。

1. TIFF文件结构

TIFF文件数据格式由图像文件头、图像文件目录、目录入口和图像数据4个部分组成,如图2-10所示。

图2-10 TIFF文件格式的结构

TIFF文件的应用非常广泛,这是因为:

(1)TIFF可以描述多种类型的图像。

(2)TIFF拥有一系列的压缩方案可供选择。

(3)TIFF不依赖于具体的硬件。

(4)TIFF是一种可移植的文件格式。

(5)TIFF是一种主要的压缩方法。

(6)多种色彩表示方法。

2. 文件头

每一个TIFF文件的第一个数据结构称为图像文件头(image file header, IFH),它是图像文件体系结构的最高层。文件头部分共8字节,格式如图2-11所示。

图2-11 文件头格式

这个结构在一个TIFF文件中是唯一的,有固定的位置,位于文件的开始部分,包含了正确解释TIFF文件其他部分所需的必要信息。

3. 文件目录

文件目录(image file directory, IFD)是TIFF文件的第2个数据结构,包含了文件的重要信息,即IFD提供了一系列的指针,这些指针包含了各种有关的数据字段在文件中的开始位置,并给出每个字段的数据类型及长度。其格式如图2-12所示。

一个TIFF图像可有多个IFD,说明该文件有多幅图像。每一个标记一幅图像的基本属性。IFD结构包含3个成员,其中项数(directory entry count)占2字节,指出该结构有多少个目录入口;随后是线性排列的Directory Entry序列,数量不定,这就是TIFF文件称为可扩充标记的文件的原因,用户甚至可以添加自定义的标记属性,每一个directory entry标记了图像的某一属性;最后一个成员是偏移量,标记下一个文件目录相对于文件开始处的位置。

图2-12 文件目录格式

4. 目录入口

每个目录入口(directory entry, DE)共由12字节组成,格式如图2-13所示。

图2-13 目录入口格式

一个DE就是一幅图像的某一属性,它包含图像的大小、分辨率、压缩信息、像素的行与列数量、每一像素由几位表示(1表示二值图像,8代表256色)等。目录入口中的Tag成员是该属性的编号,编号按升序排列。第2个成员是数据类型,共有5种数据类型。第3个成员是数据的长度,第4个成员是到Z值的偏移量,是指Tag标识的代表的变量值相对于文件开始处的偏移量,如果该值小于4字节,则直接将该值存放即可。

5. 图像数据

根据IFD所指向的地址,紧随上述数据之后就是图像数据;图像数据的存储形式有不同的方式。TIFF-B用于二值图像,TIFF-G用于灰度图像,TIFF-P用于带调色板的图像,TIFF-R用于RGB真彩色图像。

TIFF文件格式适于在应用程序之间和计算机平台之间的文件交换,它的出现使得图像数据交换变得简单。TIFF是一个灵活适应性强的文件格式,通过在文件头中包含“标签”它能够在一个文件中处理多幅图像和数据。标签能够标明图像的大小或定义图像数据如何排列及是否使用压缩选项。如TIFF可以包含JPEG和行程长度编码压缩的图像。TIFF文件也可包含基于矢量的裁剪区域(剪切或者构成主体图像的轮廓)。使用无损格式存储图像的能力使TIFF文件成为图像存档的有效方法。与JPEG不同,TIFF文件可以编辑然后重新存储而不会有压缩损失。

每个TIFF文件都是从指示字节顺序的两个字节开始的。II表示小字节在先,MM表示大字节在先。后面两个字节表示数字42。42的读取方法取决于头两个字节所表示的字节顺序。整个文件根据所指出的字节顺序进行读取。

TIFF的最大局限在于用4byte表示偏移量,这样导致文件大小的上限为4GB。在20年前制定TIFF标准时4GB足够大,但现在却成了制约TIFF的一个瓶颈。目前BigTIFF已经提出用8个字节来表示偏移量。这样数据量应该足够大了。此外,TIFF文件的复杂性给它的应用带来了一些问题。

2.5.5 GIF文件

GIF(graphics interchange format)即图像互换格式,是CompuServe于1987年开发出来的图像文件格式。GIF文件的数据采用了一种基于LZW算法的连续色调的无损压缩格式,允许用户为图像设置背景的透明属性,其压缩率一般在50%左右,它不属于任何应用程序。目前几乎所有相关软件都支持GIF,GIF图像文件是一种在网络上非常流行的图形文件格式。GIF图像文件格式的特点之一是数据是经过压缩的,其采用的是可变长度压缩算法。GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,若将存储在一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。

GIF格式由CompuServe引入应用后,因其体积小和成像相对清晰,在早期的互联网上大受欢迎。GIF文件采用无损压缩技术,对于256色以内的图像,则可既减少文件的大小,又保持图像的质量。GIF图像是基于颜色列表的(存储的数据是该点颜色对应于颜色表的索引值),最多支持8位(256色)。GIF文件内部分成许多存储块,用于存储多幅图像或者是决定图像表现行为的控制块,用以实现动画和交互式应用。

GIF主要分为两个版本,即GIF 89a和GIF 87a。

(1)GIF87a:1987年制定的版本。

(2)GIF89a:1989年制定的版本。在该版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程序编程接口等四个区块,并提供了对透明色和多帧动画的支持。

GIF文件内部是按块划分的,包括控制块和数据块两种。控制块控制数据块的行为,不同的控制块包含不同的控制参数。数据块只包含一些8bit的字符流,由它前面的控制块来决定它的功能,数据块长度为0~255字节,数据块的第一个字节是该数据块的长度,计算数据块的长度时不包括这个字节,所以一个空的数据块也有一个字节,那就是数据块的大小&H00。控制块中的逻辑屏幕描述块和全局彩色表的作用范围是整个数据流,其他控制块仅控制跟在它们后面的图形描述块。一个GIF文件的结构可分为文件头(file hearder)、GIF数据流(GIF data stream)和文件结束块(trailer)三个部分。GIF文件的典型结构如表2-8所示。

表2-8 GIF文件的基本结构

根据表2-8所示的基本结构,对GIF文件详述如下。

1. GIF文件头

GIF文件头描述块定义GIF数据流,文件头由GIF标记域(signature)和版本号(version)域组成,是一个由6个固定字节组成的数据块,它们用来说明使用的文件是GIF格式及当前的版本号,标志域和版本域各占3字节。GIF标记域存放的是GIF,版本号域存放的是1987年5月发布的87a或1989年7月发布的89a,或更新的版本号。

GIFHEADER结构定义如下:

2. 逻辑屏幕描述块

逻辑屏幕描述块(logical screen descriptor)包含定义图像显示区域的参数,包括背景颜色信息。这个数据块中的坐标是相对于虚拟屏幕的左上角开始的,不一定是指显示屏的绝对坐标,因此可以参照窗口软件环境下的窗口坐标或者打印机坐标来设计图像显示程序。逻辑屏幕描述块的结构如表2-9所示。

表2-9 逻辑屏幕描述块的结构

GIFSCRDESC结构定义如下:

逻辑屏幕描述块包含7字节。字节0和字节1用于说明逻辑显示屏的宽度,字节2和字节3用于说明逻辑显示屏的高度,字节4用于描述彩色表的属性,字节5用于指定背景颜色索引,字节6用于计算像素的宽高比。相关细节详述如下。

(1)屏幕描述块中的第5个字节称为包装域(packed fields),它由4个子域组成:

①全局彩色表标志(global color table flag)域G用来说明是否有全局彩色表存在。若G=1,表示有一个全局彩色表将紧跟在这个逻辑屏幕描述块之后;这个标志也用于选择背景颜色索引(background color index)。如果G=1,背景颜色索引域中的值就用作背景颜色的索引。

②彩色分辨率(color resolution)域CR用于表示原始图像可用的每种基色的位数(实际值减1)。这个位数表示整个调色板的大小,而不是这幅图像使用的实际颜色数。若该域的值CR=3,说明原始图像可用每个基色有4位的调色板来生成彩色图像。

③彩色表排序标志(sort flag)域S用于表示全局彩色表中的颜色是否按重要性(或使用率)排序。若S=0,表示没有重要性排序;若S=1,表示最重要的颜色排在前。这样做的目的是辅助颜色数比较少的解码器能够选择最好的颜色子集,在这种情况下解码器就可选择彩色表中开始段的彩色来显示图像。

④全局彩色表大小(size of global color table)域Size表示每个像素的位数,它用于计算全局彩色表中包含的字节数。在全局彩色表标志域G=0时就不用计算,G=1时就需计算彩色表的大小,具体计算参考本节全局彩色表。

(2)屏幕描述块中的第6个字节是背景颜色索引,它是彩色表的一个索引值,用于指定背景颜色。若全局彩色表标志域G=0,这个域的值也设置为0。

(3)像素宽高比(pixel aspect ratio)域中的值是一个因数,是计算原始图像像素的宽高比的一个近似值。该域的值范围为1~255。若该值不等于0,则宽高比的近似值按下式计算:

Aspect Ratio=(Pixel Aspect Ratio+15)/64

像素宽高比定义成像素的宽度与高度之比,比值的范围在4:1~1:4之间,其增量为1/64。

3. 全局彩色表

由于一个GIF文件可以包含多幅彩色图像,每幅彩色图像也许都包含适合自身特点的彩色表,因此一个GIF文件可以有好几个彩色表。但归纳起来只有两类:全局彩色表和局部彩色表。全局彩色表可用于图像本身没有带彩色表的所有图像和无格式文本扩展块(plain text extension)图像,而局部彩色表只用于紧跟在它后面的一幅图像。在处理全局彩色表和局部彩色表时需要注意如下规则。

(1)如果GIF文件包含全局彩色表,而且要显示的图像本身又带有局部彩色表,则显示该幅彩色图像时就用自有的彩色表,而不用全局彩色表。在这种情况下,解码器就首先保存全局彩色表,然后使用局部彩色表显示图像,最后再恢复全局彩色表。

(2)全局彩色表和局部彩色表都是可选的。基于此,解码器最好要保存全局彩色表直到出现另一个全局彩色表为止。这样,对于包含完全没有彩色表的一幅或者多幅彩色图像的GIF文件就可以使用最后保存的全局彩色表进行处理。

(3)如果同类型的图像能够使用相同的彩色表来显示,编码器就要尽可能使用一个全局彩色表;如果没有彩色表可用,解码器就可以使用计算机系统提供的彩色表或者解码器自身的彩色表。

(4)全局彩色表是否存在由逻辑屏幕描述块中第5字节的全局彩色表标志域G的值确定,若存在,彩色表就紧跟在逻辑屏幕描述块之后。

4. 图像描述块

GIF图像文件格式可包含多幅图像,而且无固定存放顺序,仅用一个字节图像分隔符(image separator)来判断是否为图像描述块。每一幅图像都由一个图像描述块、局部彩色表(该表可以没有)和图像数据组成。每幅图像必须在逻辑屏幕描述块中定义的逻辑屏尺寸范围内。图像描述块之前可以有一个或者多个控制块,如图形控制扩展块之后可有一个局部彩色表。无论前后是否有各种数据块,图像描述块总是带有图像数据。图像描述块的结构如下。

图像描述块的第9个字节称为包装域(packed fields)字节,它由5个子域组成:

(1)局部彩色表标志域L用于说明是否有局部彩色表存在。如果L=1,表示有一个局部彩色表将紧跟在这个图像描述块之后;如果G=0,表示图像描述块后面没有局部彩色表,该图像将使用全局彩色表。

(2)交插显示标志(interlace flag)域I用于表示该图像是不是交插图像(interlaced images)。如果I=0,表示该图像不是交插图像;如果I=1,表示该图像是交插图像。使用该位标志可知道图像数据是如何存放的。GIF文件格式定义了两种数据存储方式:一种是按图像行连续顺序存储,这个顺序与显示器上显示行的顺序相同;另一种按交插方式存储。交插图像按行分成如下所示的4组:

①Group 1:每隔8行组成一组,从第0行开始显示/第1遍交插。

②Group 2:每隔8行组成一组,从第4行开始显示/第2遍交插。

③Group 3:每隔4行组成一组,从第2行开始显示/第3遍交插。

④Group 4:每隔2行组成一组,从第1行开始显示/第4遍交插。

显示图像需要较长的时间,使用这种方法存放和显示图像数据可以在图像显示完成之前看到这幅图像的概貌,而不觉得显示时间长。

(3)彩色表排序标志域的含义与全局彩色表中域的含义相同。

(4)保留(reserved)。

(5)局部彩色表大小域的值用于计算局部彩色表中所包含的字节数。

5. 局部彩色表

局部彩色表用于紧跟在它后面的图像。彩色表是否存在取决于图像描述块中局部彩色表标志位的设置,彩色表的结构和大小与全局彩色表完全相同。

6. 表基图像数据

GIF图像采用了LZW算法对图像数据进行压缩。为提高压缩编码的效率,对LZW编码器输出的代码采用可变长度码VLC。表基图像数据(table based image data)由LZW最小代码长度和图像数据组成,LZW最小代码长度域的值用于确定图像数据中LZW代码使用的初始位数。图像数据由数据子块(data sub-blocks)序列组成。数据子块的结构是一个可变长度的数据块,其长度由块大小域(block size)域中的值确定,字节数为0~255。

7. 图形控制扩展块

图形控制扩展块(graphic control extension)包含处理图形描绘块时需使用的参数,它的结构说明如下:

(1)扩展导入符(extension introducer)用于识别扩展块的开始,域中的值是一个数值等于0x21的固定值。

(2)图形控制标签用于标识当前块是一个图形控制扩展块,域中的值是一个数值等于0xF9的固定值。

(3)块大小(block size)用于说明该扩展块所包含字节数,该字节数是从这个块大小域之后到块结束符之间的字节数。控制块数据结果如下:

(4)处理方法(disposal method)规定图形显示之后译码器要用规定的方法进行处理。用户输入标志(user input flag)域表示在继续处理之前是否需要用户输入响应。在延时时间和用户输入标志都设置为1的情况下,继续处理的开始时间取决于用户响应输入在前还是延时时间结束在前。

(5)透明(transparency flag)表示是否给出透明索引。

(6)延时时间(delay time)用于指定在图形显示之后继续处理数据流之前的等待时间,一百分之一秒为单位。

(7)当且仅当透明标志位设置为1时,透明索引用于指示处理程序是否要修改显示设备上的相应像点。当且仅当透明标志位设置为1时,就要修改。

(8)块结束符(block terminator)表示该图形控制扩展块结束,它是由一个字节组成的数据块,该域的值是一个固定的值0x00。

8. 无格式文本扩展块

无格式文本扩展块即图像说明扩充块,无格式文本扩展块包含文本数据和描绘文本所需的参数。文本数据用7位的ASCII字符编码并以图形形式显示。扩展块的结构如下。

其中,byBlockSize用于指定该图像扩充块的长度,取值为13;wTextGridLeft用于指定文字显示方格相对于逻辑屏幕左上角的X坐标(像素);wTextGridTop用于指定文字显示方格相对于逻辑屏幕左上角的Y坐标;wTextGridWidth用于指定文字显示方格的宽度;wTextGridDepth用于指定文字显示方格的高度;byCharCellWidth用于指定字符的宽度;byCharCellDepth用于指定字符的高度;byForeColorIndex用于指定字符的前景色;byBackColorIndex用于指定字符的背景色。

9. 注释扩展块

注释扩展块(comment extension)域的内容用于说明图形、作者或者其他任何非图形数据和控制信息的文本信息。其中的注释数据是序列数据子块,每块字节数为1~255。

10. 应用程序扩展块

应用程序扩展块(application extension)包含制作该图像文件的应用程序的相关信息,GIF中用识别码0xFF来判断一个扩充块是否为应用程序扩充块。它的结构定义如下:

其中,byBlockSize用于指定该应用程序扩充块的长度,其值为12;byIdentifier用于指定应用程序名称;byAuthentication用于指定应用程序的识别码。

11. GIF文件结束块

结束块(GIF trailer)表示GIF文件的结尾,它包含一个固定的数值0x3B。