1 BMP位图结构
BMP是一种原始的三基色的图像格式,该格式的图像是未经过压缩的图像,BMP在FAT32文件系统的中的存储,有文件头,信息头等部分,这篇博客就是记录将BMP图像数据通过调用FAT32 文件系统的函数,从而写入到SD中。
BMP位图可以有16位,24位,32位等,其中16位为RGB565,而24为通常为真彩色图片RGB888,32位图像,除了RGB通道外还有alpha通道,代表图像的透明度。
一幅大小为1920*1080的图像的真彩色16进制的图像信息如下图所示:其中这幅图像是全白的,可以看到非FF部分是图像的文件头和信息头。其中文件头和信息头的定义如下:
1.1 BMP图像的文件头
文件头和信息头是一字节对齐的。在文件头中,对应于BMP格式的图像,其各个字段有如下含义:
- 其第一个字(W)用来指示文件类型,也就是前面图像16进制的0x424d。
- 然后是DW用来指定文件的大小,文件大小是以字节为单位来表示的,以上图为例,图像大小为1920X1080,由于采用RGB888格式的真彩色图像,所以一幅图像的全部字节应该为图像所占字节加上文件头和信息头的全部信息。因此一幅图像所占空间为1920*1080*3 + 54 = 0x005EEC36,也就16进制中的3~6字节。
- 在之后2个W为保留字
- 头文件最后一个DW中,表示实际图像的起始数据距离图像文件的起始位置,上面所示的是0x36,也就是54个字节,正好是文件头和信息头的长度。
字段 | 长度(字节) | 含义 |
---|---|---|
bfType | 2 | 文件类型,BMP格式为BM |
bfSize | 4 | 文件的大小以字节为单位 |
bfReserved1 | 2 | 保留字,默认为0 |
bfReserved2 | 2 | 保留字,默认为0 |
bfOffBits | 4 | 从文件头到实际数据的偏移字节数 |
文件头
1.2 BMP位图信息头
在信息头中,其各个字段有如下含义
字段 | 长度(字节) | 含义 |
---|---|---|
biSize | 4 | 信息头长度 |
biWidth | 4 | 位图宽度 |
biPlanes | 2 | 表示目标设备级别 |
biBitCount | 2 | 一个像素的位数 |
biCompression | 4 | 位图的压缩类型 |
BiSizeImage | 4 | 位图大小 |
biXPixelPerMeter | 4 | 位图水平分辨率 |
biYPixelPerMeter | 4 | 位图垂直分辨率 |
biClrUsed | 4 | 使用到的颜色 |
biClrImportant | 4 | 颜色权重 |
- 第1个DW用来指示信息头的大小,在上图中是0x00000028也就是表示信息头的长度为40个字节。
- 第2个W用来表示位图的宽度,在上图中是0x00000780,也就是1920
- 第3个DW用来表示位图的高度,在上图中是0x00000438,也就是1080
- 接下来1个W表示目标设备级别,为1 0x0001;
- 接下来1个W是像素的位数,上面的图中是真彩色的所以为24 0x0018
- 接下来1个DW是位图的压缩类型,0x00000000表示不压缩
- 接下来1个DW是位图的大小,0x005EEC00 = 1920X1080X3
- 接下来1个DW是水平分辨率
- 接下来1个DW是垂直分辨率
- 接下来1个DW是实际使用颜色表中和的颜色数
11.接下来1个是位图颜色的权重
信息头
2 SD卡与FAT32文件系统
对于FAT32文件系统,其主页地址如下:FatFs文件系统主页,在该主页上能够找到常用的函数信息。
对于要将BMP图像数据写入到SD中,常用的函数和步骤如下:
首先挂载文件,然后打开文件,移动指针到文件指定位置,然后对文件进行读写,再进行同步,最后关闭文件。再官网中,对这些函数都有详细的介绍。
对于想要将一幅BMP图像数据写入到SD中,需要按照上述步骤完成,指示在写入数据阶段,需要将BMP图像的文件头,信息头和数据依次填充进去。
参考:
V3 学院尤老师