BMP格式最大的特征是没有任何的压缩,因此文件尺寸比较大,不适合网络传输,但是优点是这种图像格式中的数据读取出来不需要任何解码器解码就可以直接使用.
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:分别是位图文件头、位图信息头、调色板(24bit位图是没有的)、位图数据(RGB)。
可以看到,BMP文件的位图文件头和位图信息头一共为54字节大小,其中位图文件头为14字节,位图信息头为40字节。
练习:设计程序,利用系统IO读取磁盘上指定BMP图片的宽和高,以及BMP图片的大小,并输出到终端,要求图片名称通过命令行传递。
点击查看代码
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char const *argv[]){
int bmp_higth = 0;
int bmp_size = 0;
int bmp_width = 0;
//1.打开bmp图片(图片路径是从终端传输,注意验证有效性)
if(2 != argc){
printf("argument is invalid");
return -1;
}
//2.打开bmp,非内核用open
int bmp_fd = open(argv[1],O_RDWR);
if(-1 == bmp_fd){
printf("open error");
return -1;
}
//3.从被打开的bmp中获取图像信息
lseek(bmp_fd,2,SEEK_SET);
read(bmp_fd,&bmp_size,4);
lseek(bmp_fd,18,SEEK_SET);
read(bmp_fd,&bmp_width,4);
lseek(bmp_fd,22,SEEK_SET);
read(bmp_fd,&bmp_higth,4);
//4.输出图像信息
printf("the size:%d ,the width:%d ,the higth:%d",bmp_size,bmp_width,bmp_higth);
return 0;
}
字节对齐
计算机的CPU为了提高工作效率,所以读取数据的时候会进行字节对齐,一般图像刷新都是行为单位,所以CPU每次都是读取一行的大小,所以32bit系统下如果一行字节大小不是4的倍数,就会进行字节补齐,目的是提高效率,是典型的用空间来换时间的案例!
分辨率是10*10,每行10个像素点,每个像素点3字节,所以一行是30个字节,不够4的倍数,所以需要在每行的末尾补2个字节。
由于每行必须是4的倍数,所以需要补齐的字节数有4种情况:0、1、2、3,所以需要设计算法来计算每行需要自动补齐的字节数。 公式: byte = ( 4 - (width*3 % 4) ) % 4
存储顺序
如果打算了解BMP图片内部数据的存储顺序(大端 or 小端),应该去查看BMP文件内部数据结构,需要使用专业工具(HEX十六进制查看器)。
可以知道BMP图片内部数据是采用小端方式进行存储。