图像文件格式
文章目录
要进行图像处理,就必须了解图像文件的格式,即图像文件的数据构成。数字图像有多种存储格式,不同的格式一般由不同的开发商支持。==每一种图像文件均有一个文件头,文件头之后才是图像数据。==文件头的内容一般有改图像文件的制作者决定,一般包括**文件类型、制作者、制作时间、版本号、文件大小等内容。**各种图像文件的制作还涉及图像文件的压缩方式和存储效率等。
下面介绍几种常见的图像文件格式。
BMP
对于位图文件的介绍,按照它在计算机存储的顺序来。
位图文件头
//WORD是无符号的2字节整数;DWORD是无符号的4字节整数
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef struct tagBITMAPFILEHEADER{ //bit map file header--指的就是位图文件头
WORD bfType;//文件类型,必须是0x424D,即字符串“BM”
DWORD bfSize;//指定文件大小,包括文件头的14字节
WORD bfReserved1;//保留字,不用考虑
WORD bfReserved2;//保留字,不用考虑
DWORD bfOffBits;//从文件头到实际位图数据的偏移字数
}BITMAPFILEHEADER;
不会有人不知道保留字是什么吧?
简单来说就是在这个结构体内留一点没有使用的空间,以便以后对这个结构体进行修改。如果没有留保留字会导致占用的文件信息几乎需要全部挪一下,大家都知道信息在计算机中以二进制的方式保存,问题就是头文件它会按照一行一行的变量存放。就比如你现在突然想往里面加个什么东西,就像数组在中间插值,需要把后面的元素全部向后挪。
解释一下bfSize和bfOffBits:
bfSize
:指的是这个这个文件头结构体的大小=2+4+2+2+4=14字节。
bfOffBits
:实际上的位图数据是图像的信息(以二进制存储),但是在这张图片下实际包含的信息并不只有图像,还包括这张图像的类型、制作时间、文件大小等等内容。位图文件头就是保存文件的信息的。
举一个数组的栗子:A[1-5]存的是文件头;A[6-24]存的是其他东西(下文提及);从A[25]开始就存的是位图数据。
那么A[5]=25,它告诉我们实际的位图数据与文件头之间的差值。
不会还要提一嘴此处的文件并不是我们常规意义上的那种docx文件吧
位图信息头
typedef struct tagBITMAPINFOHEADER{ //bit map info header
DWORD biSize;//改结构的长度:2+4+4+2+2+4+4+4+4+4+4=2*3+4*8=40字节
long biWidth;//图像的宽度,单位是像素
long biHeight;//图像的长度,单位是像素
WORD biPlanes;//位平面数,必须是1,不用考虑
WORD biBitCount;//指定颜色的位数,1是2色(黑白),4为16色,8为256色,16、24、32为真彩色
DWORD biCompression;//指定是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIFLDS
DWORD biSizeImage;//实际的位图数据所占用的字节数
long biXPelsPerMeter;//目标设备水平分辨率,单位是每米的像素数
long biYPelsPerMeter;//目标设备垂直分辨率,单位是每米的像素数
DWORD biClrUsed;//实际使用的颜色数
DWORD biClrImportant;//图像中重要的颜色数,若该值=0:所有颜色都是重要的
}BITMAPINFOHREADER;
biClrUsed
:若该值=0:使用的颜色数为 2 b i B i t C o u n t 2^{biBitCount} 2biBitCount
其中biCompression
指定是否压缩,有效的值为BI_RGB
,BI_RLE8
,BI_RLE4
,BI_BITFIFLDS
,这些都是一些Windows预定义的常量。由于RLE4
和RLE8
的压缩格式用得不多,这里只讨论biCompression
的有效值为BI_RGB
。
不会有人连RGB是什么都不知道吧?–自己查查看叭。
调色板(palette)
这是对于需要调色板的位图文件而言的。真彩色图像是不需要调色板的(文件信息头后就是直接是位图数据)。调色板实际上是一个数组,共有biClrUsed
个元素,每个元素类型都是一个RGBQUAD
结构。
typedef unsigned char Byte;//一个字节
typedef struct tagRGBQUAD{ //占用4字节
Byte rgbBlue; //该颜色的蓝色分量
Byte rgbGreen; //该颜色的绿色分量
Byte rgbRed; //该颜色的红色分量
byte rgbReserved;//保留值
}RGBQUAD;
图像数据
对于用到调色板的位图:图像数据就是该像素颜色在调色板中的索引值。
对于真彩色图像:图像数据就是实际的R、G、B值。
下面对于2色、16色、256色和真彩色图像分别进行介绍。
2:用1bit 就可以表示该像素的颜色(0表示black、1表示white),1byte可以表示8个像素。
16:用4bit 可以表示1个像素的颜色,1byte可以表示2个像素。
256:1byte刚好表示1个像素。
真彩色(true-color)是指图像中的每个像素值都分成R、G、B三个基色分量,每个基色分量直接决定其基色的强度,这样产生的色彩称为真彩色。
例如图像深度为24,用R:G:B=8:8:8来表示色彩,则R、G、B各占用8位来表示各自基色分量的强度,每个基色分量的强度等级为 2 8 2^8 28=256种。图像可容纳 $ 2^{24}$=16M种色彩(24位色)。
24位色被称为真彩色,它可以达到人眼分辨的极限,发色数是1677万多色,也就是2的24次方。但32位色就并非是2的32次方的发色数,它其实也是1677万多色,不过它增加了256阶颜色的灰度,为了方便称呼,就规定它为32位色。
少量显卡能达到36位色,它是24位发色数再加512阶颜色灰度。但其实自然界的色彩是不能用任何数字归纳的,这些只是相对于人眼的识别能力,这样得到的色彩可以相对人眼基本反映原图的真实色彩,故称真彩色。
PS:
- 每一行的byte数必须是4的整数倍。如果不是,就需要补齐。
- BMP文件的数据存放是从下到上、从左到右的。
\\\\\\
TIF
标记图像文件格式(tag image file format,TIF),它是现存的图像文件格式中最复杂的一种,它体哦那个存储各种信息的完备手段,可以存储专门的信息而不违反格式宗旨,是目前流行的图像文件交换标准之一。TIF文件由文件头、参数指针表、参数域、参数数据表和图像数据4部分构成。
文件头
字节 | 说明 |
---|---|
0 – 1 | 说明字符顺序,合法值:0X4949:表示字节顺序由低到高;0X4D4D:表示字节顺序由高到低 |
2 – 3 | TIFF版本号,总为0XZA |
4 – 7 | 指向第一个参数指针表的指针 |
参数指针
由一个2byte的整数和其后的12byte参数域构成,最后以一个long int
结束。
若最后的long int
=0,表示文件的参数指针表到此为止;否则指向下一个参数指针表的偏移。
字节 | 说明 |
---|---|
0 – 1 | 参数域的个数n |
2 – 13 | 第一个参数块 |
14 – 25 | 第二个参数块 |
··· | ··· |
2+12n – 6+12n | 为0或指向下个参数指针表的偏移 |
参数块结构
字节 | 说明 |
---|---|
0 – 1 | 参数码,为254-321间的整数 |
2 – 3 | 参数类型:(1)byte、(2)char、(3)short、(4)long、(5)RATIOAL(4B分母,4B分子) |
4 – 7 | 参数长度或参数项个数 |
8 – 11 | 参数数据,或指向参数数据的指针 |
\\\\\\
GIF
CompuServe开发了图形交换格式(graphics interchange format,GIF),目的是在不同的系统平台上交流和传输图像。它是在Web及其他联机服务上常用的一种文件格式,用于超文本标记语言(HTML)文档中的索引颜色图像,但图像最大不能超过64MB,颜色最多为256色。GIF图像采用LZW压缩算法,存储效率高,支持多幅图像按顺序逐幅显示,交错多屏幕绘图以及文本覆盖。GIF主要是为数据流而设计的一种传输方式,而不是作为文件的一种存储格式。它具有顺序的组织形式。
GIF有5个主要部分,以固定顺序出现,所有部分均由一个或多个块组成。每个块第一个byte中存放标识码或特征码标识。==这部分的顺序为:文件标志块、逻辑屏幕描述块、可选的“全局”色彩表块(调色板)、各图像数据块(or 专用块)以及尾块(结束码)。
文件标志块:
Header | 识别标识符“GIF”和版本号(“87a”or”89a”) |
---|
逻辑屏幕描述块:
Logical Screen Descriptor | 定义了包围所有后面图像的一个图像平面的大小、纵横尺寸以及颜色深度,以及是否存在全局色彩表 |
---|
全局色彩表块:
Global Color Table | 色彩表的大小由该图像使用的颜色数决定,若表示颜色的二进制数为111,则图像用到的颜色数为 2 7 + 1 2^{7+1} 27+1 |
---|
图像数据块:
Image Descriptor | 图像描述块 |
---|---|
Local Color Table | 局部色彩块 |
Table Based Image Date | 表式压缩图像数据 |
Graphic Control Extension | 图像控制扩展块 |
Plain Text Extension | 无格式文本扩展块 |
Comment Extension | 注释扩展块 |
Application Extension | 应用程序扩展块 |
尾块:
GIF Trailer | 值为 ( 3 B ) H (3B)_H (3B)H,表示数据流已结束 |
---|
\\\\\\
PCX
由ZSoft公司设计,是最早使用的图像文件格式之一,由各种扫描仪扫描得到的图像几乎都能保存成PCX格式。PCX支持256种颜色,不如TARGA或TIF等格式功能强,但是结构较简单,存取速度快,压缩比适中,适于一般软件使用。
PCX格式支持RGB、索引颜色、灰度和位图颜色模式,但不支持Alpha通道。PCX支持RLE压缩方法,每像素包含的位数据和彩色平面数。
位图数据用行程长度压缩算法记录数据。
\\\\\\
JPEG
JPEG(Joint Photographer’s Experts Group,联合图像专家组)是由ISO和CCITT为静态图像所建立的第一个国际数字图像压缩标准,主要是为了解决专业摄影师所遇到的图像信息过于庞大的问题。由于JPEG的高压缩比以及良好的图像质量,使得它广泛应用于多媒体和网络程序。JPEG和GIF成为HTML语法选用的图像格式。
JPEG格式支持24bit颜色,并保留照片和其他连续色调图像中存在的亮度和色相的显著和细微变化。JPEG一般基于DCT变换的顺序型模式压缩图像。JPEG通过有选择的选择减少数据来压缩文件大小。因为它会弃用数据,所以JPEG压缩是有损压缩。采用较高品质设置,可使弃用的数据较少,但是会降低图像中细节的清晰度,尤其包含文字或是矢量图形的图像,会比较明显。