bmp与wav文件格式详解

  截至目前,我们已经完成了SD卡FAT文件系统的文件列表,并能简单读文件的第一扇区。不能读完整文件的原因主要是我们不知道如何读取一个文件相对应的大小,可能导致我们在读A文件时因为读入数据过多,而越界到B文件。接下来我们将了解一下wav和bmp两种文件格式在SD卡中的表现形式,了解后,我们能够完成读取整个文件的工作。

先看bmp文件,拿之前的bmp文件头举例。

 

 首先我们应当知道bmp的一些基础信息,比如我这张图属性如下:

 这张图片的大小应该是 640*480*24/8,即921600,而图2中可以看到该文件的大小为921654字节,占用空间为933888字节,与实际大小有出入。那么这些数据差异是在哪里产生的呢?

  通过查阅资料,可以明确的知道,24位彩色的bmp文件的大小,是它的宽像素*高像素*3+54,那么就能跟我们图2中文件大小对上了,接下来讲解这54个字节的具体作用。

多出来的54个字节在文件数据首部。

 

1.bmp文件头,一共14字节

42 4D表明文件格式是BM,也即代表BMP(这里是小端存储)。

00 0E 10 36 表示文件大小,这里是921654字节

00 00 保留位1,必须设置为0

00 00 保留位2,必须设置为0

00 00 00 36 表示文件头到位图数据的偏移,也就是文件头的54个字节大小

2.位图信息头,一共40字节

00 00 00 28 表示信息头大小,即54-14=40

00 00 03 82 以像素为单位说明图像宽度,即640

00 00 01 E0 以像素为单位说明图像高度,同时如果为正,说明图像倒立(即数据表示从图像左下角到右上角排列),如果为负

说明正向。即480。

00 01 为目标设备说明颜色平面数,总被设置为1

00 18 说明像素数,即深度,这里是24

00 00 00 00 说明图像的压缩类型,基本用0,即不压缩

00 01 E0 00 说明位图数据的大小,即921600,也就是文件大小-文件头

00 00 0B 13 表示水平分辨率,单位是像素/米,有符号整数

00 00 0B 13 表示垂直分辨率,单位是像素/米,有符号整数

00 00 00 00 说明位图使用的调色板中的颜色索引数,为0,说明使用所有

00 00 00 00 说明对图像显示有重要影响的颜色索引数,为0,说明同样重要

对于有些bmp图片,还会有调色板信息头,可以由文件头到位图数据的偏移和位图信息头大小推算出来

比如这里偏移是54,位图信息头是40,bmp文件头是14,54=14+40,因此没有调色板信息。

———————————————————————————————————————————

而wave格式则与之类似,同样是文件头+文件数据的格式,不过wave格式的文件头大小为44字节

 

1.Chunk区

52 49 46 46 对应RIFF 的asic码,内容固定(这里也是小端存储)

00 11 49 48  块大小,指除去ChunkID 和ChunkSize的剩余部分的字节数,也即从这个数据末到文件末的字节数,这里是1132872字节

57 41 56 45 对应WAVE四个字母的ASIC码

2.FMT subChunk区

66 6D 74 20 表示subChunk1ID的值,也就是“fmt+空格”的asic码

00 00 00 10  四个字节内容固定,表示该字块剩余空间大小,是16

00 01 两个字节内容固定,说明当前编码格式是PCM

00 02 两个字节内容固定,表明通道数为2

00 00 BB 80 四个字节用于表示采样率,也就是48000

00 02 EE 00 四个字节用于表示传输速率,也就是192000

00 04 两个字节用于表示每个样本点占字节数 也就是4

00 10 两个字节用于表示每个样本占bit数,也就是16

到这里,FMT结束,对应前面00 00 00 10 的而剩余空间大小——16

3.Data subChunk区

64 61 74 61 四个字节内容固定,对应data的asic码,也是subChunk2ID的值

00 11 49 24 表示音频数据段大小,这里是1132836。

以上所有数据,一共是44字节,再加上最后音频数据段大小1132836,也就是1132880。

与下面文件的属性是吻合的。

 

 至此,介绍了bmp与wave两种文件格式的组成结构,其余文件也是类似,在需要解码时查询资料即可。

 

posted @ 2021-12-26 10:24  狂生墨客  阅读(49)  评论(0)    收藏  举报