简介
BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。
结构
1、位图文件头(0~13字节)
0~1字节 表示文件类型
第一个42表示B,第二个4D表示M,bmp格式前两个字节默认是这两个
2~5字节 表示文件大小 bytes
6~9字节保留字 一般为0
10~13字节 位图数据的起始位置
2、位图信息头(14~53字节)
14~17字节 :信息头占用字节数 bytes
18~21字节 : 位图的宽度(像素)
22~25字节 :位图的高度(像素)
26~29字节 :表示位图色彩级别,一般为24
30~33字节 :表示压缩类型,0表示不压缩
34~37字节 :位图阵列表字节数
38~41字节 :表示水平分辨率
42~45字节 :表示垂直分辨率
46~49字节 :表示位图实际使用的颜色表中的颜色变址。
50~53字节 :表示位图显示过程中被认为重要颜色变址数。
3、彩色表 …
4、定义位图的字节阵列 …
注意:
1、一个像素占的字节数=位深度/8
2、bmp格式存储的时候,每一行的总字节数必须等于4的倍数,如果不是4的倍数,会自动补0,所以存位图信息的时候要跳过自动补0的那些字节,具体计算见代码。
3、读取时以字节为单位倒着读取,比如文件大小2~5字节的数据记录为82 21 00 00,实际上文件大小是00002182
#include <bits/stdc++.h>
#define uint unsigned int
using namespace std;
struct BMP{
unsigned char B; //默认B
unsigned char M; //默认M
uint fileSize; //文件大小
uint Reserved1; //保留字
uint headerLength; //头大小
uint Infosize; //位图信息头的长度 40 bytes
uint width;
uint height;
unsigned short level; //设备级别
unsigned short colorDepth; //色彩级别
uint compress; //压缩类型,0表示不压缩
uint pexelBytes; //位图阵列表字节数
uint horizon; //水平分辨率
uint vertical; //垂直分辨率
uint offset1; //位图实际使用的颜色表中的颜色变址
uint offset2; //位图显示过程中被认为重要颜色变址数
}bmp;
void read(char *path) {
FILE *f = fopen(path,"rb");
fread(&bmp.B, 1, 1, f);
fread(&bmp.M, 1, 1, f);