bitmap文件格式的解析

经过两天的研究,大致了解了一下bitmap的格式解析,特此记录下来,方便以后自己查询和继续学习。

首先,一个bitmap格式文件大致分为4个部分,分别是文件头信息,图像描述块,颜色表和图像数据区,下面一个个来看。

文件头信息,用一个结构体来保存相关的信息,结构体如下:

      typedef struct tagBitMapFileHeader   /* bmfh */

{

    //unsigned short bfType; // 固定大小为0x4d42

    unsigned int bfSize; // 保存整个文件大小

    unsigned short bfReserved1; // 保留字

    unsigned short bfReserved2; // 保留字

    unsigned int bfOffBits; // 实际位图数据的位移字节数,即前三个部分长度之和

} bitMapFileHeader;

这里由于一个bmp文件开头必定是BM,所以可以跳过其检查,如果加入那两个字节,读入会出错,大概是因为windows分配数据默认是4个字节,不足4个字节要补齐,这样就会导致这个结构体为16个字节,所以可以直接将那两个字节跳过,也可以在开始加上#pragrampack(1) 这样就不会有影响了,结构体就是14个字节了,具体作用已注释。

图像块描述,结构体如下:

typedefstruct tagBitMapInfoHeader

{

    unsigned int biSize; // 指定此结构的长度

    unsigned int biWidth; // 位图宽

    unsigned int biHeight; // 位图高

    unsigned short biPlanes; // 平面数为1

    unsigned short biBitCout; // 采用颜色位数,可以是1,2,4,8,16,24

    unsigned int biCompression; // 压缩方式,可以为0,1,2 0表示不压缩

    unsigned int biSizeImage; // 实际位图数据占用的字节数

    unsigned int biXPelsPerMeter;  // x方向分辨率

    unsigned int biyPelsPerMeter;  // y方向分辨率

    unsigned int biClrUsed; // 使用的颜色数,如果为0,则表示默认值(2……颜色位数);

    unsigned int biClrImportant; // 重要颜色数,如果为0,则表示所有的颜色都是重要的颜色

}bitMapInfoHeader;

这里没什么要注意的,详细的见注释就好,另外如果biBitCout为24以下,则有第三部分调色板信息,24及以上则没有,直接保留的就是RGB信息。这里暂时讨论的都是24位,所以就没有讨论第三部分。

第三部分结构体可以如下:

typedefstruct tagRGBQUAD

{

 

    unsigned char rgbBlue; //该颜色的蓝色分量

    unsigned char rgbGreen; //该颜色的绿色分量

    unsigned char rgbRed; //该颜色的红色分量

    //unsigned char rgbReserved; //保留值

}rgbQUAD;

最主要的就是第四部分,也有一些注意项,这里我是用24位为例,毕竟24位偏多。

首先图像数据存储是从最低端的左边开始,到最顶端的右边结束,已行为主序,也就是说,你从图像数据区的第一个24的RGB信息是图片左下角的信息,接着的24位RGB为接着的一个像素的信息。还有一点比较重要的就是,为了读取速度快,windows要求每行的字节数为4的倍数,而bmp则响应了这个要求,如果一行的数据字节不足4的倍数则要0不足,也就是说不一定能连着读,这样也许会读到一些没用的数据,比如一个29*29像素的位图,一行有29个像素点,而每个像素点都有3个字节(RGB)来构成颜色信息,也就是说一行有87个字节,这样就要在加上一个字节为0,凑成88,这样在读每一行读够29个像素后,在读入一个字节的信息,然后舍弃,在接着读,这样最后的信息就是正确的结果,有个公式可以计算每行最后要舍弃的字节数。4-(bmpInfoHeader.biWidth* (bmpInfoHeader.biBitCout / 8) % 4) bmpinfoHeader.biWidth 为位图的宽度,bmpinfoHeader.biBitCout为位深度,即多少位保留一个颜色信息,24位图就是24,8位图就是8,这样得到的结果就是每行要舍弃的字节数。

 

大概就是这样了,写这个的意图就是记录一下学习的体验,以及一些注意事项,方便以后查阅学习以及快速掌握bmp关键。接下来有时间会继续研究下调色板。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值