第6章 图像文件格式.docx
《第6章 图像文件格式.docx》由会员分享,可在线阅读,更多相关《第6章 图像文件格式.docx(50页珍藏版)》请在冰豆网上搜索。
![第6章 图像文件格式.docx](https://file1.bdocx.com/fileroot1/2022-11/30/6b0bb116-e4c5-478f-b900-13b87e3b5f16/6b0bb116-e4c5-478f-b900-13b87e3b5f161.gif)
第6章图像文件格式
第6章图像文件格式
本章从大量的图像文件格式中选择了三种常用的图像文件结构和一种正在推广的图像文件格式进行介绍,目的是为读者分析图像和编程提供一个概貌。
BMP位图格式是Windows上画图软件(Paint)使用的格式,GIF和JFIF是因特网上几乎所有Web浏览器都支持的图像文件格式,使用GIF文件格式的动画软件也得到广泛使用。
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式。
现在开发的几乎所有的图像处理软件都支持这些格式。
学习本章内容时,重点是了解图像文件的组织和结构,为我们今后开发新的文件格式提供思路,因此只需要阅读每节开头的“简介”和“文件结构”即可,详细内容不必深究。
若要编程,则需要仔细阅读本章内容以及本章后面提供的参考文献[1][2]。
6.1BMP文件格式
6.1.1简介
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。
Windows3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependentbitmap,DDB)文件格式。
Windows3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independentbitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。
BMP位图文件默认的文件扩展名是BMP或者bmp。
6.1.2文件结构
位图文件可看成由4个部分组成:
位图文件头(bitmap-fileheader)、位图信息头(bitmap-informationheader)、彩色表(colortable)和定义位图的字节阵列,它们的名称和符号如表6-01所示。
表6-01BMP图像文件组成部分的名称和符号
位图文件的组成
结构名称
符号
位图文件头(bitmap-fileheader)
BITMAPFILEHEADER
bmfh
位图信息头(bitmap-informationheader)
BITMAPINFOHEADER
bmih
彩色表(colortable)
RGBQUAD
aColors[]
图像数据阵列字节
BYTE
aBitmapBits[]
位图文件结构可综合在表6-02中。
表6-02位图文件结构内容摘要
偏移量
域的名称
大小
内容
图像文件
头
0000h
标识符(Identifier)
2bytes
两字节的内容用来识别位图的类型:
‘BM’:
Windows3.1x,95,NT,…
‘BA’:
OS/2BitmapArray
‘CI’:
OS/2ColorIcon
‘CP’:
OS/2ColorPointer
‘IC’:
OS/2Icon
‘PT’:
OS/2Pointer
0002h
FileSize
1dword
用字节表示的整个文件的大小
0006h
Reserved
1dword
保留,设置为0
000Ah
BitmapDataOffset
1dword
从文件开始到位图数据开始之间的数据(bitmapdata)之间的偏移量
000Eh
BitmapHeaderSize
1dword
位图信息头(BitmapInfoHeader)的长度,用来描述位图的颜色、压缩方法等。
下面的长度表示:
28h-Windows3.1x,95,NT,…
0Ch-OS/21.x
F0h-OS/22.x
0012h
Width
1dword
位图的宽度,以像素为单位
0016h
Height
1dword
位图的高度,以像素为单位
001Ah
Planes
1word
位图的位面数
图像
信息
头
001Ch
BitsPerPixel
1word
每个像素的位数
1-Monochromebitmap
4-16colorbitmap
8-256colorbitmap
16-16bit(highcolor)bitmap
24-24bit(truecolor)bitmap
32-32bit(truecolor)bitmap
001Eh
Compression
1dword
压缩说明:
0-none(也使用BI_RGB表示)
1-RLE8-bit/pixel(也使用BI_RLE4表示)
2-RLE4-bit/pixel(也使用BI_RLE8表示)
3-Bitfields(也使用BI_BITFIELDS表示)
0022h
BitmapDataSize
1dword
用字节数表示的位图数据的大小。
该数必须是4的倍数
0026h
HResolution
1dword
用像素/米表示的水平分辨率
002Ah
VResolution
1dword
用像素/米表示的垂直分辨率
002Eh
Colors
1dword
位图使用的颜色数。
如8-位/像素表示为100h或者256.
0032h
ImportantColors
1dword
指定重要的颜色数。
当该域的值等于颜色数时,表示所有颜色都一样重要
调色板数据
0036h
Palette
N*4byte
调色板规范。
对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:
∙1字节用于蓝色分量
∙1字节用于绿色分量
∙1字节用于红色分量
∙1字节用于填充符(设置为0)
图像数据
0436h
BitmapData
xbytes
该域的大小取决于压缩方法,它包含所有的位图数据字节,这些数据实际就是彩色调色板的索引号
6.1.3构件详解
1.位图文件头
位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义:
typedefstructtagBITMAPFILEHEADER{/*bmfh*/
UINTbfType;
DWORDbfSize;
UINTbfReserved1;
UINTbfReserved2;
DWORDbfOffBits;
}BITMAPFILEHEADER;
其中:
bfType
说明文件的类型.
bfSize
说明文件的大小,用字节为单位
bfReserved1
保留,设置为0
bfReserved2
保留,设置为0
bfOffBits
说明从BITMAPFILEHEADER结构开始到实际的图像数据之间的字节偏移量
2.位图信息头
位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-informationheader)和彩色表(colortable)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。
BITMAPINFO结构具有如下形式:
typedefstructtagBITMAPINFO{/*bmi*/
BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColors[1];
}BITMAPINFO;
其中:
bmiHeader
说明BITMAPINFOHEADER结构
bmiColors
说明彩色表RGBQUAD结构的阵列
BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:
typedefstructtagBITMAPINFOHEADER{/*bmih*/
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount;
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER;
其中:
biSize
说明BITMAPINFOHEADER结构所需要的字节数
biWidth
说明图像的宽度,以像素为单位
biHeight
说明图像的高度,以像素为单位
biPlanes
为目标设备说明位面数,其值设置为1
biBitCount
说明位数/像素,其值为1、2、4或者24
biCompression
∙说明图像数据压缩的类型。
其值可以是下述值之一:
BI_RGB:
没有压缩;
∙BI_RLE8:
每个像素8位的RLE压缩编码,压缩格式由2字节组成(重复像素计数和颜色索引);
∙BI_RLE4:
每个像素4位的RLE压缩编码,压缩格式由2字节组成
biSizeImage
说明图像的大小,以字节为单位。
当用BI_RGB格式时,可设置为0
biXPelsPerMeter
说明水平分辨率,用像素/米表示
biYPelsPerMeter
说明垂直分辨率,用像素/米表示
biClrUsed
说明位图实际使用的彩色表中的颜色索引数
biClrImportant
说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。
现就BITMAPINFOHEADER结构作如下说明:
(1)彩色表的定位
应用程序可使用存储在biSize成员中的信息来查找在BITMAPINFO结构中的彩色表,如下所示:
pColor=((LPSTR)pBitmapInfo+(WORD)(pBitmapInfo->bmiHeader.biSize))
(2)biBitCount
biBitCount=1表示位图最多有两种颜色,黑色和白色。
图像数据阵列中的每一位表示一个像素。
biBitCount=4表示位图最多有16种颜色。
每个像素用4位表示,并用这4位作为彩色表的表项来查找该像素的颜色。
例如,如果位图中的第一个字节为0x1F,它表示有两个像素,第一像素的颜色就在彩色表的第2表项中查找,而第二个像素的颜色就在彩色表的第16表项中查找。
biBitCount=8表示位图最多有256种颜色。
每个像素用8位表示,并用这8位作为彩色表的表项来查找该像素的颜色。
例如,如果位图中的第一个字节为0x1F,这个像素的颜色就在彩色表的第32表项中查找。
biBitCount=24表示位图最多有224=16777216种颜色。
bmiColors(或者bmciColors)成员就为NULL。
每3个字节代表一个像素,其颜色有R、G、B字节的相对强度决定。
(3)ClrUsed
BITMAPINFOHEADER结构中的成员ClrUsed指定实际使用的颜色数目。
如果ClrUsed设置成0,位图使用的颜色数目就等于biBitCount成员中的数目。
(4)图像数据压缩
①BI_RLE8:
每个像素为8位的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式可在同一幅图中的任何地方使用。
编码方式:
由2个字节组成,第一个字节指定使用相同颜色的像素数目,第二个字节指定使用的颜色索引。
此外,这个字节对中的第一个字节可设置为0,联合使用第二个字节的值表示:
∙第二个字节的值为0:
行的结束。
∙第二个字节的值为1:
图像结束。
∙第二个字节的值为2:
其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量。
绝对方式:
第一个字节设置为0,而第二个字节设置为0x03~0xFF之间的一个值。
在这种方式中,第二个字节表示跟在这个字节后面的字节数,每个字节包含单个像素的颜色索引。
压缩数据格式需要字边界(wordboundary)对齐。
[例6.1]用十六进制表示的8位压缩图像数据如下:
0304050600034556670002780002050102780000091E0001
这些压缩数据可解释为:
压缩数据
扩展数据
0304
040404
0506
0606060606
000345566700
455667
0278
7878
00020501
从当前位置右移5个位置后向下移一行
0278
7878
0000
行结束
091E
1E1E1E1E1E1E1E1E1E
0001
RLE编码图像结束
②BI_RLE4:
每个像素为4位的RLE压缩编码,同样也可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式也可在同一幅图中的任何地方使用。
这两种方式是:
编码方式:
由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引,一个在高4位,另一个在低4位。
第一个像素使用高4位的颜色索引,第二个使用低4位的颜色索引,第3个使用高4位的颜色索引,依此类推。
绝对方式:
这个字节对中的第一个字节设置为0,第二个字节包含有颜色索引数,其后续字节包含有颜色索引,颜色索引存放在该字节的高、低4位中,一个颜色索引对应一个像素。
此外,BI_RLE4也同样联合使用第二个字节中的值表示:
∙第二个字节的值为0:
行的结束。
∙第二个字节的值为1:
图像结束。
∙第二个字节的值为2:
其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量。
[例6.2]用十六进制数表示的4位压缩图像数据:
0304050600064556670004780002050104780000091E0001
这些压缩数据可解释为:
压缩数据
扩展数据
0304
040
0506
06060
000645566700
455667
0478
7878
00020501
从当前位置右移5个位置后向下移一行
0478
7878
0000
行结束
091E
1E1E1E1E1
0001
RLE图像结束
3.彩色表
彩色表包含的元素与位图所具有的颜色数相同,像素的颜色用RGBQUAD结构来定义。
对于24-位真彩色图像就不使用彩色表,因为位图中的RGB值就代表了每个像素的颜色。
彩色表中的颜色按颜色的重要性排序,这可以辅助显示驱动程序为不能显示足够多颜色数的显示设备显示彩色图像。
RGBQUAD结构描述由R、G、B相对强度组成的颜色,定义如下:
typedefstructtagRGBQUAD{/*rgbq*/
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
其中:
rgbBlue
指定蓝色强度
rgbGreen
指定绿色强度
rgbRed
指定红色强度
rgbReserved
保留,设置为0
4.位图数据
紧跟在彩色表之后的是图像数据字节阵列。
图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。
扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。
6.2GIF文件格式
6.2.1简介
GIF(GraphicsInterchangeFormat)是CompuServe公司开发的图像文件存储格式,1987年开发的GIF文件格式版本号是GIF87a,1989年进行了扩充,扩充后的版本号定义为GIF89a。
GFI图像文件以数据块(block)为单位来存储图像的相关信息。
一个GIF文件由表示图形/图像的数据块、数据子块以及显示图形/图像的控制信息块组成,称为GIF数据流(DataStream)。
数据流中的所有控制信息块和数据块都必须在文件头(Header)和文件结束块(Trailer)之间。
GIF文件格式采用了LZW(Lempel-ZivWalch)压缩算法来存储图像数据,定义了允许用户为图像设置背景的透明(transparency)属性。
此外,GIF文件格式可在一个文件中存放多幅彩色图形/图像。
如果在GIF文件中存放有多幅图,它们可以像演幻灯片那样显示或者像动画那样演示。
6.2.2.文件结构
GIF文件结构的典型结构如图6-01所示。
为下文说明方便,在构件左边加了编号。
1
Header
GIF文件头
2
LogicalScreenDescriptor
逻辑屏幕描述块
3
GlobalColorTable
全局彩色表
…扩展模块(任选)…
4
ImageDescriptor
图形描述块
5
LocalColorTable
局部彩色表(可重复n次)
可
6
TableBasedImageData
表式压缩图像数据
重
7
GraphicControlExtension
图像控制扩展块
复
8
PlainTextExtension
无格式文本扩展块
n
9
CommentExtension
注释扩展块
个
10
ApplicatonExtension
应用程序扩展块
…扩展模块(任选)…
11
GIFTrailer
GIF文件结束块
图6-01GIF文件结构
数据块可分成3类:
控制块(ControlBlock),图形描绘块(Graphic-RenderingBlock)和专用块(SpecialPurposeBlock)。
(1)控制块:
控制块包含有用来控制数据流(DataStream)或者设置硬件参数的信息,其成员包括:
∙GIF文件头(Header)
∙逻辑屏幕描述块(LogicalScreenDescriptor)
∙图形控制扩展块(GraphicControlExtension)
∙文件结束块(Trailer)
(2)图形描绘块:
包含有用来描绘在显示设备上显示图形的信息和数据,其成员包括:
∙图像描述块(ImageDescriptor)
∙无格式文本扩展块(PlainTextExtension)
(3)特殊用途数据块;包含有与图像处理无关的信息,其成员包括:
∙注释扩展块(CommentExtension)
∙应用扩展块(ApplicationExtension)
除了在控制块中的逻辑屏幕描述块(LogicalScreenDescriptor)和全局彩色表(GlobalColorTable)的作用范围是整个数据流(DataStream)之外,所有其他控制块仅控制跟在它们后面的图形描绘块。
6.2.3构件详解
1.GIF文件头
文件头描述块(Header)定义GIF数据流(GIFDataStream),它的结构如图6-02所示。
文件头描述块(Header)由GIF标记域(Signature)和版本号(Version)域组成,是一个由6个固定字节组成的数据块,它们用来说明使用的文件格式是GIF格式及当前所用的版本号。
GIF标记域(Signature)存放的是“GIF”,版本号域存放的是1987年5月发布的“87a”或者1989年7月发布的“89a”,或者更加新的版本号。
7
6
5
4
3
2
1
0
字节号
域的名称
数据类型
0
Signature
1
GIF标记
3Bytes
2
3
Version
4
版本号
3Bytes
5
图6-02标记/版本数据块的结构
2.逻辑屏幕描述块
逻辑屏幕描述块(LogicalScreenDescriptor)包含定义图像显示区域的参数,包括背景颜色信息。
这个数据块中的坐标相对于虚拟屏幕的左上角,不一定是指显示屏的绝对坐标,这就意味可以参照窗口软件环境下的窗口坐标或者打印机坐标来设计图像显示程序。
逻辑屏幕描述块的结构如图6-03所示:
7
6
5
4
3
2
1
0
字节号
域的名称
类型
LogicalScreenWidth
0
逻辑屏幕宽度
Unsigned
1
(以像素为定单位)
LogicalScreenHeight
2
逻辑屏幕高度
Unsigned
3
(以像素为定单位)
G
CR
S
Size
4
包装域
见图6-04
BackgroundColorIndex
5
背景颜色索引
Byte
PixelAspectRatio
6
像素宽高比
Byte
图6-03屏幕描述块的结构
逻辑描述块包含7个字节。
字节0和字节1用来说明逻辑显示屏的宽度,字节3和字节4用来说明逻辑显示屏的高度,字节4用来描述彩色表的属性,字节5用来指定背景颜色索引,字节6用来计算像素的宽高比。
现作如下说明:
(1)屏幕描述块中的第5个字节称为包装域(PackedFields),它的位结构如图6-04所示,它由4个子域组成:
①全局彩色表标志(GlobalColorTableFlag)域G用来说明是否有全局彩色表存在。
如果G=1,表示有一个全局彩色表(GlobalColorTable)将紧跟在这个逻辑屏幕描述块(LogicalScreenDescriptor)之后;这个标志也用来选择背景颜色索引(BackgroundColorIndex)。
如果G=1,背景颜色索引(BackgroundColorIndex)域中的值就用作背景颜色的索引。
②彩色分辨率(ColorResolution)域CR用来表示原始图像可用的每种基色的位数(实际值减1)。
这个位数表示整个调色板的大小,而不是这幅图像使用的实际的颜色数。
例如,如果该域的值CR=3,说明原始图像可用每个基色有4位的调色板来生成彩色图像。
③彩色表排序标志(SortFlag)域S用来表示全局彩色表(GlobalColorTable)中的颜色是否按重要性(或者称使用率)排序。
如果S=0,表示没有重要性排序;如果S=1表示最重要的颜色排在前。
这样做的目的是辅助颜色数比较少的解码器能够选择最好的颜色子集,在这种情况下解码器就可选择彩色表中开始段的彩色来显示图像。
④全局彩色表大小(