完整word版BMP文件结构读写操作图文c实现Word格式文档下载.docx
- 文档编号:16073979
- 上传时间:2022-11-18
- 格式:DOCX
- 页数:12
- 大小:103.20KB
完整word版BMP文件结构读写操作图文c实现Word格式文档下载.docx
《完整word版BMP文件结构读写操作图文c实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《完整word版BMP文件结构读写操作图文c实现Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
其定义如下:
typedefstructtagBITMAPFILEHEADER
{
WORDbfType;
DWORDbfSize;
WORDbfReserved1;
WORDbfReserved2;
DWORDbfOffBits;
}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;
BITMAPFILEHEADER结构的各个域详细说明如下:
bfType:
位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。
bfSize:
位图文件大小,包括这14个字节。
bfReserved1,bfReserved2:
Windows保留字,暂不用。
bfOffBits:
从文件头到实际的位图数据的偏移字节数,图1-7中前3个部分的长度之和。
图1-7
BMP文件结构示意图
第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。
typedefstructtagBITMAPINFOHEADER
DWORDbiSize;
LONGbiWidth;
LONGbiHeight;
WORDbiPlanes;
WORDbiBitCount
DWORDbiCompression;
DWORDbiSizeImage;
LONGbiXPelsPerMeter;
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,
*PBITMAPINFOHEADER;
BITMAPINFOHEADER结构的各个域的详细说明如下:
biSize:
本结构的长度,为40个字节。
biWidth:
位图的宽度,以像素为单位。
biHeight:
位图的高度,以像素为单位。
biPlanes:
目标设备的级别,必须是1。
biBitCount:
每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。
biCompresssion:
位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。
这里只讨论未经压缩的情况,即biCompression=BI_RGB。
biSizeImage:
实际的位图数据占用的字节数,该值的大小在第4部分位图数据中有具体解释。
biXPelsPerMeter:
指定目标设备的水平分辨率,单位是像素/米。
biYPelsPerMeter:
指定目标设备的垂直分辨率,单位是像素/米。
biClrUsed:
位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂。
biClrImportant:
位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
第3部分为颜色表。
颜色表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幂个元素)。
RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:
typedefstructtagRGBQUAD
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
RGBQUAD结构的各个域的详细说明如下:
rgbBlue:
该颜色的蓝色分量;
rgbGreen:
该颜色的绿色分量;
rgbRed:
该颜色的红色分量;
rgbReserved:
保留字节,暂不用。
有些位图需要颜色表;
有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。
对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为
个字节;
对于biBitCount值为8的灰度图像,每像素占8bit,图像中有
颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为
而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。
第4部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之后,记录了图像的每一个像素值。
对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;
对于真彩色图,位图数据就是实际的R、G、B值(三个分量的存储顺序是B、G、R)。
下面分别就2色、16色、256色和真彩色位图的位图数据进行说明:
对于2色位图,用1位就可以表示该像素的颜色,所以1个字节能存储8个像素的颜色值。
对于16色位图,用4位可以表示一个像素的颜色。
所以一个字节可以存储2个像素的颜色值。
对于256色位图,1个字节刚好存储1个像素的颜色值。
对于真彩色位图,3个字节才能表示1个像素的颜色值。
需要注意两点:
第一,Windows规定一个扫描行所占的字节数必须是4的倍数,不足4的倍数则要对其进行扩充。
假设图像的宽为biWidth个像素、每像素biBitCount个比特,其一个扫描行所占的真实字节数的计算公式如下:
DataSizePerLine=(biWidth*biBitCount/8+3)/4*4
那么,不压缩情况下位图数据的大小(BITMAPINFOHEADER结构中的biSizeImage成员)计算如下:
biSizeImage=DataSizePerLine*biHeight
第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。
1.2.2BMP图像文件的读写
1.2.2
BMP图像文件的读写
分析了BMP文件结构后,让我们用简单的C程序实现一个给定BMP位图文件的读写操作,来进一步巩固对图像数据的理解,这也是我们后续图像可视化编程的基础。
此部分的代码以及后面两节所讲述的代码在工程chap1-1中的bmpReadWrite.cpp文件中,读者可以查阅。
1.BMP文件的读入
BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进行处理,即先处理BITMAPFILEHEADER结构,然后是BITMAPINFOHEADER结构、颜色表,最后是位图数据。
首先,有关BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD等结构的定义包含在头文件“Windows.h”中,应把其包含进来。
#include"
Windows.h"
其次,为了后面对图像进行修改及存盘方便,我们定义了几个全局变量,用来存放读入图像的位图数据、宽、高、颜色表及每像素位数等信息。
所定义的全局变量如下:
unsignedchar*pBmpBuf;
//读入图像数据的指针
intbmpWidth;
//图像的宽
intbmpHeight;
//图像的高
RGBQUAD*pColorTable;
//颜色表指针
intbiBitCount;
//图像类型,每像素位数
根据BMP文件结构,BMP文件读入操作的基本流程如图1-8所示。
图1-8
BMP文件读入操作流程图
readBmp()函数实现了BMP文件的读取操作,下面的代码是对readBmp()函数的说明和实现。
/****************************************
*******************************
*函数名称:
*
readBmp()
*
*函数参数:
char*bmpName-文件名字及路径
*返回值:
0为失败,1为成功
*说明:
给定一个图像文件名及其路径,读图像
的位图数据、宽、高、颜色表及每像素
位数等数据进内存,存放在相应的全局变量中
****************************************
*******************************/
boolreadBmp(char*bmpName)
//二进制读方式打开指定的图像文件
FILE*fp=fopen(bmpName,"
rb"
);
if(fp==0)return0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp,sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,
存放在变量head中
BITMAPINFOHEADERhead;
fread(&
head,sizeof(BITMAPINFOHEADER),1,fp);
//获取图像宽、高、每像素所占位数等信息
bmpWidth=head.biWidth;
bmpHeight=head.biHeight;
biBitCount=head.biBitCount;
//定义变量,计算图像每行像素
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word BMP 文件 结构 读写 操作 图文 实现