资源描述:
《BPM图像读取C++程序.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、#include"StdAfx.h"#include"RWBMPImg.h"CRWBMPImg::CRWBMPImg(void){}CRWBMPImg::~CRWBMPImg(void){}////////////////////////////////////////////////读取BMP图像BOOLCRWBMPImg::ReadBMPFile(constchar*filename,BYTEImg*pbuf){inti,j,addr,nbit;intbmpwidth,bmpheight;BITMAPFILEHEA
2、DERbmfh;//defineBMPfileheadBITMAPINFOHEADERbmih;//defineBMPinformationheadif(pbuf==NULL){MessageBox(NULL,"传入的图像结构体指针为NULL!","错误",MB_ICONHAND);returnFALSE;}FILE*fp_BMP;errno_terr;if((err=fopen_s(&fp_BMP,filename,"rb"))!=0){MessageBox(NULL,"BMP图像文件打开失败!","错误",MB_I
3、CONHAND);returnFALSE;}//readBMPfileheadfread(&bmfh.bfType,sizeof(unsignedshort),1,fp_BMP);if(bmfh.bfType!=(unsignedshort)0x4D42){//如果文件头两个不是"BM"MessageBox(NULL,"BMP图像文件头错误!","错误",MB_ICONHAND);if(fp_BMP!=NULL)fclose(fp_BMP);returnFALSE;}fread(&bmfh.bfSize,sizeof(
4、unsignedlong),1,fp_BMP);fread(&bmfh.bfReserved1,sizeof(unsignedshort),1,fp_BMP);fread(&bmfh.bfReserved2,sizeof(unsignedshort),1,fp_BMP);fread(&bmfh.bfOffBits,sizeof(unsignedlong),1,fp_BMP);//readBMPinformationheadfread((char*)&bmih,sizeof(BITMAPINFOHEADER),1,fp_
5、BMP);bmpwidth=(int)bmih.biWidth;//因为BMP图像宽度应是4的倍数bmpheight=(int)bmih.biHeight;//读取图像高度if(bmih.biBitCount==8)nbit=1;elseif(bmih.biBitCount==24)nbit=3;else{MessageBox(NULL,"BMP图像位数错误!","错误",MB_ICONHAND);if(fp_BMP!=NULL)fclose(fp_BMP);returnFALSE;}//判断传入的图像内存空间是否和图
6、像文件大小一致if(pbuf->width!=bmpwidth
7、
8、pbuf->height!=bmpheight
9、
10、pbuf->BitCount!=bmih.biBitCount){//MessageBox(NULL,"实际BMP图像文件大小与传入的图像内存大小不一致!","错误",MB_ICONHAND);//重新分配合适大小的内存空间if(!(m_imgstr.ReAllocate_TypeImgStruct(pbuf,bmpwidth,bmpheight,bmih.biBitCount))){MessageBox
11、(NULL,"内存重新分配错误!","错误",MB_ICONHAND);if(fp_BMP!=NULL)fclose(fp_BMP);returnFALSE;}}//距离文件起始点偏移bmfh.bfOffBits,开始读图像fseek(fp_BMP,bmfh.bfOffBits,SEEK_SET);//一行的像素缓冲及大小BYTE*linebuf;intlinebuf_size;linebuf_size=(bmih.biWidth*nbit+3)/4*4;linebuf=(BYTE*)malloc(linebuf_si
12、ze*sizeof(BYTE));if(linebuf==NULL){MessageBox(NULL,"行缓冲内存分配错误!","错误",MB_ICONHAND);if(fp_BMP!=NULL)fclose(fp_BMP);returnFALSE;}//读取数据for(i=bmpheight-1;i>=0;i--){addr=i