BMP、JPEG文件格式详解 |
您所在的位置:网站首页 › bmp格式的游戏怎么玩 › BMP、JPEG文件格式详解 |
文章目录
六、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):**就是图像数据啦_ 这种存储方式称为小端方式(little endian) , 与之相反的是大端方式(big endian)。 2、BMP文件头 0E-11:00000028h = 40,这就是说我这个位图信息头的大小为40个字节。前面我们已经说过位图信息头一般有40个字节,既然是这样,为什么这里还要给一个字段来说明呢?这里涉及到一些历史,其实位图信息头原本有很多大小的版本的。我们看一下下表: 出于兼容性的考虑,大多数应用使用了旧版的位图信息头来保存文件。而 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。索引号就是所在行的行号,对应的颜色就是所在行的四个元素。这里截取一些数据来说明: 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、位图数据下面就是位图数据了,每个像素占一个字节,取得这个字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上就可以了。 注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。 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 |