VC++数字图像处理(4)

2019-03-11 13:37

* char *bmpName-文件名字及路径

* unsigned char *imgBuf-待存盘的位图数据 * int width-以像素为单位待存盘位图的宽 * int height-以像素为单位待存盘位图高 * int biBitCount-每像素所占位数 * RGBQUAD *pColorTable-颜色表指针 *返回值:

* 0为失败,1为成功 *

*说明:给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息, * 将其写到指定文件中

***********************************************************************/ bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable) {

//如果位图数据指针为0,则没有数据传入,函数返回 if(!imgBuf) return 0;

//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0 int colorTablesize=0; if(biBitCount==8) colorTablesize=1024;

//待存储图像数据每行字节数为4的倍数 int lineByte=(width * biBitCount/8+3)/4*4; //以二进制写的方式打开文件 FILE *fp=fopen(bmpName,\ if(fp==0) return 0;

//申请位图文件头结构变量,填写文件头信息

BITMAPFILEHEADER fileHead; fileHead.bfType = 0x4D42;//bmp类型 //bfSize是图像文件4个组成部分之和

fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lineByte*height; fileHead.bfReserved1 = 0; fileHead.bfReserved2 = 0;

//bfOffBits是图像文件前3个部分所需空间之和 fileHead.bfOffBits=54+colorTablesize; //写文件头进文件

fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); //申请位图信息头结构变量,填写信息头信息 BITMAPINFOHEADER head; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40;

head.biSizeImage=lineByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; //写位图信息头进内存

fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); //如果灰度图像,有颜色表,写入文件 if(biBitCount==8)

fwrite(pColorTable, sizeof(RGBQUAD),256, fp); //写位图数据进文件

fwrite(imgBuf, height*lineByte, 1, fp); //关闭文件 fclose(fp); return 1; }

对于readBmp()和saveBmp()函数的简单调用如下:

void main() {

//读入指定BMP文件进内存 char readPath[]=\ readBmp(readPath); //输出图像的信息

printf(\biBitCount=%d\\n\biBitCount); //将图像数据存盘

char writePath[]=\

saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable); //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间 delete []pBmpBuf; if(biBitCount==8) delete []pColorTable; }

该main()函数将指定BMP文件读入内存,将图像信息打印输出,最后又原样存入指定文件中。读者可以打开程序当前目录下的“dog.bmp”和“dogcpy.bmp”两个文件进行对比。

以上对于BMP文件的读写函数仅针对灰度图像(biBitCount=8)和彩色图像(biBitCount=24)两种格式,对于其他如biBitCount=1的图像类型,读者可以根据需要,自己对程序作简单

的修改即可实现。本书中后续的代码实现也都是围绕灰度和彩色两种格式进行的,希望读者予以注意。

1.2.3 BMP图像位图数据的访问

上面main()函数将图像文件读入内存,又写到文件里去,那么在读入图像数据后、写入文件前的一段时间里,图像的数据是在内存中存在的,这也是我们可以修改(访问)图像数据的时机所在。

假设内存中位图数据的指针为pBmpBuf,一行像素所占的字节数为lineByte(4的倍数)那么,对于灰度图像,第i行第j列的像素指针(所在的存储空间位置)为pBmpBuf+i*lineByte+j,*(pBmpBuf+i*lineByte+j)是该像素的灰度值,如果想让该像素变成指定颜色,只需要给*(pBmpBuf+i*lineByte+j)赋指定的值即可;对于彩色图像,每像素占3个字节,那么pBmpBuf+i*lineByte+j*3+0、pBmpBuf+i*lineByte+j*3+1、pBmpBuf+i*lineByte+j*3+2分别代表了第i行第j列像素B、G、R三个分量的指针,若想给该点指定一种颜色,则需要给三个分量分别赋值。

下面的main()函数中,将读入的图像数据左下角1/4部分置成黑色并存盘,图1-10所示是程序运行前后图像的变化情况。

void main() {

//读入指定BMP文件进内存 char readPath[]=\ readBmp(readPath); //输出图像的信息

printf(\ //循环变量,图像的坐标 int i,j; //每行字节数

int lineByte=(bmpWidth*biBitCount/8+3)/4*4;

//循环变量,针对彩色图像,遍历每像素的三个分量 int k;

//将图像左下角1/4部分置成黑色 if(biBitCount==8){//对于灰度图像 for(i=0;i

else if(biBitCount==24){//彩色图像 for(i=0;i

for(k=0;k<3;k++)//每像素RGB三个分量分别置0才变成黑色 *(pBmpBuf+i*lineByte+j*3+k)=0; } } }

//将图像数据存盘

char writePath[]=\

saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable); //清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间 delete []pBmpBuf; if(biBitCount==8) delete []pColorTable; }


VC++数字图像处理(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:妈妈十大寿祝寿词

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: