BMP、JPEG文件格式详解

您所在的位置:网站首页 bmp格式的游戏怎么玩 BMP、JPEG文件格式详解

BMP、JPEG文件格式详解

#BMP、JPEG文件格式详解| 来源: 网络整理| 查看: 265

文章目录 六、BMP文件格式详解1、BMP文件格式2、BMP文件头3、位图信息头4、调色板5、位图数据6、对齐规则 七、JPEG文件结构分析1、JPEG2、SOI ( Start of Image )2、APP0(Application 0)3、DQT ( Define Quantization Table )4、SOF0 (Start of Frame)5、DHT ( Define Huffman Table )6、SOS ( Start of Scan )7、EOI ( End of Image )

六、BMP文件格式详解 1、BMP文件格式

BMP文件格式又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。

MP文件的数据按照从文件头开始的先后顺序分为四个部分:

**bmp文件头(bmp file header):**提供文件的格式、大小等信息

**位图信息头(bitmap information):**提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息

**调色板(color palette):**可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表

**位图数据(bitmap data):**就是图像数据啦_

image-20200807085933863

我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是位图信息头后面紧跟的就是位图数据了。因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。如数据0x1756在内存中的存储顺序为:

image-20200807090331126

​ 这种存储方式称为小端方式(little endian) , 与之相反的是大端方式(big endian)。

2、BMP文件头

image-20200807090540093

image-20200807090611966

1-2:424dh = ‘BM’,表示这是Windows支持的位图格式。有很多声称开头两个字节必须为’BM’才是位图文件,从上表来看应为开头两个字节必须为’BM’才是Windows位图文件。3-5:00010436h = 66614 B = 65.05 kB,通过查询文件属性发现一致。6-9:这是两个保留段,为0。A-D:00000436h = 1078。即从文件头到位图数据需偏移1078字节。我们稍后将验证这个数据。共有14个字节。 3、位图信息头 同样地,Windows为位图信息头定义了如下结构体:

image-20200807091355715

对照数据文件:

image-20200807091428015

​ 0E-11:00000028h = 40,这就是说我这个位图信息头的大小为40个字节。前面我们已经说过位图信息头一般有40个字节,既然是这样,为什么这里还要给一个字段来说明呢?这里涉及到一些历史,其实位图信息头原本有很多大小的版本的。我们看一下下表:

image-20200807091601223

​ 出于兼容性的考虑,大多数应用使用了旧版的位图信息头来保存文件。而 OS/2 已经过时了,因此现在最常用的格式就仅有V3 header了。因此,我们在前面说位图信息头的大小为40字节。

12-15:00000100h = 256,图像宽为255像素,与文件属性一致。16-19:00000100h = 256,图像高为255像素,与文件属性一致。这是一个正数,说明图像数据是从图像左下角到右上角排列的。1A-1B:0001h, 该值总为1。1C-1D:0008h = 8, 表示每个像素占8个比特,即该图像共有256种颜色。1E-21:00000000h,BI_RGB, 说明本图像不压缩。22-25:00000000h,图像的大小,因为使用BI_RGB,所以设置为0。26-29:00000000h,水平分辨率,缺省。2A-2D:00000000h,垂直分辨率,缺省。2E-31:00000100h = 256,说明本位图实际使用的颜色索引数为256,与1C-ID得到的结论一致。32-35:00000100h = 256,说明本位图重要的颜色索引数为256,与前面得到的结论一致。 4、调色板

​ 下面的数据就是调色板了。前面也已经提过,调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。它在文件中的布局就像一个二维数组palette[N][4],其中N表示总的颜色索引数,每行的四个元素分别表示该索引对应的B、G、R和Alpha的值,每个分量占一个字节。如不设透明通道时,Alpha为0。因为前面知道,本图有256个颜色索引,因此N = 256。索引号就是所在行的行号,对应的颜色就是所在行的四个元素。这里截取一些数据来说明:

image-20200807092505879

0号:(fe,fa,fd,00)

1号:(fd,f3,fc,00)

2号:(f4,f3,fc,00)

3号:(fc,f2,f4,00)

4号:(f6,f2,f2,00)

5号:(fb,f9,f6,00)

等等

一共有256种颜色,每个颜色占用4个字节,就是一共1024个字节,再加上前面的文件信息头和位图信息头的54个字节加起来一共是1078个字节。也就是说在位图数据出现之前一共有1078个字节,与我们在文件信息头得到的信息:文件头到文图数据区的偏移为1078个字节一致。

5、位图数据

下面就是位图数据了,每个像素占一个字节,取得这个字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上就可以了。

注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。

image-20200807092835576

也即我们见到的第一个像素60是图像最左下角的数据,第二个人像素60为图像最后一行第二列的数据,一直到最后一行的最后一列数据,后面紧接的是倒数第二行的第一列的数据,依此类推。如果图像是24位或是32位数据的位图的话,位图数据区就不是索引而是实际的像素值了。下面说明一下,此时位图数据区的每个像素的RGB颜色阵列排布:24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。32位数据按照BGRA的顺序存储,其余与24位位图的方式一样,像素的排布规则与前述一致。 6、对齐规则 讲完了像素的排列规则以及各像素的颜色分量的排列规则,最后我们谈谈数据的对齐规则。我们知道Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话对于数据的获取速度等都是有很大的增益的。因此,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充(以0填充),这样可以达到按行的快速存取。这时,位图数据区的大小就未必是 图片宽×每像素字节数×图片高 能表示的了,因为每行可能还需要进行比特填充。 七、JPEG文件结构分析 1、JPEG

JPEG文件使用的数据存储方式有多种。最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。而JPEG文件大体上可以分成两个部分:标记码(Tag)和压缩数据。标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF可以被理解为一个0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。

常用的标记有SOI、APP0、DQT、SOF0、DHT、SOS、EOI。

2、SOI ( Start of Image ) 图像开始 意义大小值标记代码两字节0xFFDB 2、APP0(Application 0) 应用程序保留标记0 字段意义大小值①标记代码2字节0xFFE0②数据长度2字节字段的总长度(不包括标记字段)③标识符5字节固定值0x4A46494600,即字符串“JFIF0”④版本号2字节一般是0x0102,表示JFIF的版本号1.2⑤X和Y的密度单位1字节0:无单位;1:点数/英寸;3:点数/厘米⑥X方向像素密度2字节不确定⑦Y方向像素密度2字节不确定⑧缩略图水平像素数目1字节不确定⑨缩略图垂直像素数目1字节不确定⑩缩略图RGB位图不确定缩略图RGB位图数据 本标记段可以包含图像的一个微缩版本,存为24位的RGB像素。如果没有微缩图像(这种情况更常见),则字段“缩略图水平像素数目”和字段“缩略图垂直像素数目”的值均为0。 3、DQT ( Define Quantization Table ) 定义量化表 字段意义大小值①标记代码2字节0xFFE0②数据长度2字节字段②和多个字段③的总长度③量化表数据长度-2字节见下表 字段③的内容为: 意义大小值精度及量化表ID1字节高4位:精度,0:8位;1:16位;低4位:量化表ID取值范围0~3表项(64×(精度+1))字节例如8位量化表其表项长度为64×(0+1)=64字节 本标记段中,字段②中包含的内容可以循环出现,表示多个量化表,但最多只能出现4次。 4、SOF0 (Start of Frame) 帧图像开始 字段意义大小值①标记代码2字节0xFFC0②数据长度2字节①~⑥ 字段的总长度③精度1字节每个数据样本的位数。通常是8位,一般软件都不支持12位和16位④图像高度2字节图像高度(单位:像素)⑤图像宽度2字节图像宽度(单位:像素)⑥颜色分量数1字节1:灰度图;3:YCrCb;4:CMYK。JFIF中使用YCrCb,故这里恒为3⑦颜色分量信息颜色分量数×3字节(通常为9字节)见下表 字段⑦中包含这些字段: 意义大小值颜色分量ID1字节水平、垂直采样因子1字节高4位:水平采样因子。低4位:垂直采样因子量化表ID1字节当前分量使用的量化表ID 字段⑦中的内容会重复出现,有多少个颜色分量(字段⑥)就出现多少次(一般为3次)。 5、DHT ( Define Huffman Table ) 定义哈夫曼表 字段意义大小值①标记代码2字节0xFFC4②数据长度2字节字段②和字段③的总长度③哈夫曼表数据长度-2字节见下表 字段③包含下列字段: 意义大小值表ID和表类型1字节高4位:类型,0:DC直流,1:AC交流。低四位,哈夫曼表ID,注意,DC和AC分开编ID不同位数的码字数量16字节如第1个字节为0x02代表长度为1的码字有2个编码内容16个不同位数的码字数量之和(字节) 此标记段中,字段③中的内容可以循环出现(一般为4次),也可以出现4次。 6、SOS ( Start of Scan ) 扫描开始 字段意义大小值①标记代码2字节0xFFDA②数据长度2字节②~⑤ 字段的总长度③颜色分量数1字节应该和SOF中的字段⑤的值相同④颜色分量信息2字节见下表a⑤压缩数据图像数据3字节见下表b 表a: 意义大小值颜色分量ID1字节直流、交流系数表号1字节高4位:直流分量使用的哈夫曼编码树编号;低4位:交流分量使用的哈夫曼树编号 表b: 意义大小值谱选择开始1字节固定值0x00谱选择结束1字节固定值0x3F谱选择1字节在基本JPEG中总为0x00 本标记段中,字段④应该重复出现,有多少个颜色分量,就出现多少次(一般为3次)。本段结束后就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以EOI标记表示结束。 7、EOI ( End of Image ) 图像结束 意义大小值标记代码2字节0xFFD9 由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理。具体方法是,在数据0xFF后添加一个没有意义的0x00。所以在读取图像信息时如果遇到0xFF00其实际意义为0xFF。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3