OpenCV中文网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 安装 配置
查看: 360|回复: 0

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

[复制链接]
发表于 2018-10-8 13:24:33 | 显示全部楼层 |阅读模式
本帖最后由 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[1]组成结构体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数据所表示的像素点是从图片的左下角开始,一直表示到图片的右上角结束。







回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|blog|OpenCV中文网站 ( 粤ICP备13079875号-2

GMT+8, 2018-12-10 12:04 , Processed in 0.048370 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表