学习之前先了解不同格式长度。
参考博文:C/C++基本数据类型长度.
为图像以二进制文件流格式读取,读取内容如下:
本例以1024*1280图像读取为例。
1、位图文件头
位图像文件头具有固定长度14字节,其定义和描述如下:
//指定文件类型
//实际读取结果:42 4d ————"BM"
unsigned short bfType;
//指定位图文件大小,以字节为单位
//实际读取结果:36 04 14 00 ———— 0X140436=1,311,798
unsigned long bfSize;
//保留字,必须为0
//实际读取结果:00 00
unsigned short bfReserved1;
//保留字,必须为0
//实际读取结果:00 00
unsigned short bfReserved2;
//指定从实际图像数据到文件头起始的偏移量,以字节为单位
//实际读取结果:36 04 00 00 ———— 0X436=1,078
unsigned long bfOffBits;
2、位图信息头
位图信息头包含了设备无关位图关于颜维度和色彩格式的信息,其定义和描述如下:
//信息头长度,以字节为单位
//实际读取结果:28 00 00 00 ———— 0X28=40
unsigned long biSize;
//位图图像的宽度,单位为像素
//实际读取结果:00 05 00 00 ———— 0X0500=1280
long biWidth;
//位图图像的高度,单位为像素
//实际读取结果:00 04 00 00 ———— 0X0400=1024
long biHeight;
//设备上颜色平面数目,必须为1
//实际读取结果:01 00 ———— 0X1=1
unsigned short biPlanes;
//储存每个像素所使用的二进制位数
//实际读取结果:08 00 ———— 0X8=8
unsigned short biBitCount;
//是否压缩储存图像数据
//实际读取结果:00 00 00 00 ———— 0X00000000=0
unsigned long biCompression;
//指定图像大小,以字节为单位
//实际读取结果:00 00 14 00 ———— 0X140000=1,310,720
unsigned long biSizeImage;
//图像水平方向分辨率,单位是像素每米
//实际读取结果:23 2e 00 00 ———— 0X2e23=3,619
long biXPelsPerMeter;
//图像垂直方向分辨率,单位是像素每米
//实际读取结果:23 2e 00 00 ———— 0X2e23=3,619
long biYPelsPerMeter;
//图像实际使用了颜色索引表中的多少种颜色
//实际读取结果:00 01 00 00———— 0X100=256
unsigned long biClzUsed;
//图像中重要的颜色数目,如果为0则全部颜色都重要
//实际读取结果:00 01 00 00———— 0X100=256
unsigned long biClrImportant;
3、调色板
不过多解释,毕竟我也不懂,理论自己搜,我直接跳过的。
4、图像数据
一般情况下,位图像数据是从左到右遍历最下面一行,再遍历上一行直到右上角。
图像数据起始位置为文件流开始位置后bfOffBits。基本信息位图头结构中都包含,尝试读写吧。
读取请参考本人博文 C++位图像(灰度值0~255)读取.