BMP图像处理
BMP
这儿有一张特别清晰的图片%%%
https://guyutongxue.github.io/img/BMP.png
查看代码
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
//1字节 = 8 bit
cout<<sizeof(int)<<endl;// int = 4 字节 = 32位
cout<<sizeof(char)<<endl;// char = 1 字节
cout<<sizeof(long long)<<endl;// ll = 8 字节
return 0;
}
/*
一个字节8位,也就是两个16进制数(一个16进制数是4位)
所以每个0x0000 0x0001 0x0002 ....
都占一个字节,表示范围0-255
*/
BMP 文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
1.文件头信息块
0000-0001:文件标识,为字母 ASCII 码“BM” 。
0002-0005:文件大小。
0006-0009:保留,每字节以“00” 填写。
000A-000D:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信
息块大小, 图像描述信息块的大小,图像颜色表的大小,保留(为 01)。
2.图像描述信息块
000E-0011:图像描述信息块的大小,常为 28H。
0012-0015:图像宽度。
0016-0019:图像高度。
001A-001B:图像的 plane 总数(恒为 1)。
001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001E-0021:数据压缩方式(数值位 0:不压缩; 1: 8 位压缩; 2: 4 位压缩)。
0022-0025:图像区数据的大小。
0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以 00H
填写。
002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以 00H
填写。
002E-0031:此图像所用的颜色数,如值为 0,表示所有颜色一样重要。
3.颜色表
颜色表的大小根据所使用的颜色模式而定: 2 色图像为 8 字节; 16 色图像位
64 字节; 256 色图像为 1024 字节。其中,每 4 字节表示一种颜色,并以 B(蓝
色)、 G(绿色)、 R(红色)、 alpha(像素的透明度值,一般不需要)。即首
先 4 字节表示颜色号 0 的颜色,接下来表示颜色号 1 的颜色,依此类推
4.图像数据区
颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的
颜色号,其记录方式也随颜色模式而定,既 2 色图像每点占 1 位(8 位为 1 字节);
16 色图像每点占 4 位(半字节); 256 色图像每点占 8 位(1 字节);真彩色图
像每点占 24 位(3 字节)。所以,整个数据区的大小也会随之变化。究其规律
而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像
素的位数) /8。