downtown56 发表于 2018-10-8 13:24:33

OpenCV日常记录_02_☞BMP文件格式详解

本帖最后由 downtown56 于 2018-10-13 14:30 编辑

一、BMP格式文件按照数据排列顺序分为4部分:
1.位图文件头结构:14字节,结构体名称BITMAPFILEHEADER,包括格式校验、位图大小等信息
2.位图信息头结构:40字节,结构体名称BITMAPINFOHEADER,包括BMP的详细信息
3.调色板(color palette):可选(由BITMAPFILEHEADER的第5个属性判断),结构体名称RGBQUAD,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
4.位图数据:16位24位和32位位图直接表示RGB值,其他位图(如1,2,4,8位图)为调色板的索引值(最大为255)

注意:结构体BITMAPINFOHEADER和结构体数组RGBQUAD组成结构体BITMAPINFO


二、BITMAPFILEHEADER结构体,14字节=2+4+2+2+4typedef struct tagBITMAPFILEHEADER {
      WORD    bfType;       //2Byte,格式校验,必须为“BM”,即0x424D
      DWORD   bfSize;       //4Byte,整个文件大小
      WORD    bfReserved1;//2Byte,保留,为0,不考虑
      WORD    bfReserved2;//2Byte,保留,为0,不考虑
      DWORD   bfOffBits;    //4Byte,文件开头到位图数据区的偏移量,即前3个部分之和,若>14+40则有调色板,若=14+40则没有
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;



三、BITMAPINFOHEADER结构体,40字节=4+4+4+2+2+4+4+4+4+4+4
typedef struct tagBITMAPINFOHEADER{
      DWORD      biSize;          //4Byte,指定结构体的字节长度,为40
      LONG       biWidth;         //4Byte,位图宽,单位:像素
      LONG       biHeight;      //4Byte,位图高,单位:像素
      WORD       biPlanes;      //2Byte,图像平面数,位图存储RGB数据,因此总为1
      WORD       biBitCount;      //2Byte,用多少位去表示一个像素的颜色,可以为1,2,4,6,8,16,24,32
      DWORD      biCompression;   //4Byte,压缩方式,0=不压缩,1=RLE8,2=RLE4
      DWORD      biSizeImage;   //4Byte,实际位图数据的字节数,以4字节对齐,=((biWidth / 4 + ((biWidth % 4 + 9) / 10)) * 4) * biHeight
      LONG       biXPelsPerMeter; //4Byte,像素/米表示水平分辨率
      LONG       biYPelsPerMeter; //4Byte,像素/米表示竖直分辨率
      DWORD      biClrUsed;       //4Byte,使用的调色板的索引总数,0=默认值(2^biBitCount)
      DWORD      biClrImportant;//4Byte,重要的颜色数,0=所有颜色都是重要的
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

注意:Windows默认的扫描的最小单位是4字节,如果数据对齐满足这个值的话数据的获取速度会有很大增益。BMP位图也顺应这一规律,所以位图数据的行字节数应是4的整数倍,若不足的用 0 补齐。这一规则影响上结构体的biSizeImage值和位图数据。不影响biWidth值,biWidth值是实际的行像素数。

四、RGBQUAD结构体,调色板,多少色位图就有多少个此结构体,由biBitCount确定,=16,24,32时没有调色表
typedef struct tagRGBQUAD {
      BYTE    rgbBlue;   //蓝色分量
      BYTE    rgbGreen;//绿色分量
      BYTE    rgbRed;   //红色分量
      BYTE    rgbReserved; //保留
} RGBQUAD;


五、位图数据
所有的DIB数据扫描行是自下而上的,DIB数据所表示的像素点是从图片的左下角开始,一直表示到图片的右上角结束。

https://user.qzone.qq.com/809291908?ADUIN=809291908&ADSESSION=1539395868&ADTAG=CLIENT.QQ.5575_MyTip.0&ADPUBNO=26813&source=namecardhoverstar





页: [1]
查看完整版本: OpenCV日常记录_02_☞BMP文件格式详解