bitmap文件格式的解析
2016-03-23 14:38
246 查看
经过两天的研究,大致了解了一下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关键。接下来有时间会继续研究下调色板。
首先,一个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关键。接下来有时间会继续研究下调色板。
相关文章推荐
- C#实现位图转换成图标的方法
- C++实现位图排序实例
- C语言实现的bitmap位图代码分享
- 数据结构之位图(bitmap)详解
- 转:抗锯齿方法两种(其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))
- 位图索引 btree索引
- 位图排序算法的一个实践
- IOS处理位图
- 学习opencv——图像颜色分布直方图
- 学习opencv——sift与suft的应用
- vc 将位图多余部分变为透明
- 2.1-2.4.文件读取时间测试
- (nehe教程)不使用auxDIBImageLoad,加载bmp文件
- 对图像进行FFT
- 数字图像处理,bmp位图灰度化
- 对图像进行FFT
- Android开发之网络图片查看方法BitmapFactory.decodeStream()学习01
- Bmp学习
- AS3.0视觉特效:像素风格图像切换
- 位图法