在学习了图像处理课程后,我对相关代码也产生了一定的兴趣,以下是通过课程学习和查询相关资料后得到的关于如何把BMP文件调入到Memory中的代码:
第一步,读取BITMAPFILEHEADER,判断是不是BMP文件,即bfTYpe!=0x4D42和bfSize!=FileSize时退出
#include“stdio.h”
#include“windows.h”
intiImageh=0,iImagew=0;
intiYRGBnum=1;//1:8位灰度,3:24位彩色
RGBQUADrgbPalette[256];
BYTE*pImageData=NULL;
voidmain(){
char*cfilename=“1.bmp”;
FILE*f=NULL;
f=fopen(cFilename,"r+b");
if(f==NULL)return;
fseek(f,0,SEEK_END);
intflen=ftell(f);
BITMAPFILEHEADERfh;
fseek(f,0,SEEK_SET);
fread(&fh,sizeof(BITMAPFILEHEADER),1,f);
if(fh.bfType!=0x4d42){//”BM”
fclose(f);
return;
}
if(fh.bfSize!=flen){
fclose(f);
return;
}
接着读入BITMAPINFOHEADER,获得核心参数biWidth,biHeight,biBitCount
BITMAPINFOHEADERih;
fread(&ih,sizeof(BITMAPINFOHEADER),1,f);
if(ih.biBitCount!=8){//只调用灰度
fclose(f);return;
}
iYRGBnum=ih.biBitCount/8;//1
iImagew=ih.biWidth;
iImageh=ih.biHeight;
if(iYRGBnum==1){
fread(rgbPalette,sizeof(RGBQUAD),256,f);
}
读入调色板RGBQUAD[256]
intsize=iImagew*iImageh*iYRGBnum;
if(pImageData){
delete[]pImageData;
pImageData=NULL;
}
pImagedata=newBYTE[size];
if(pImagedata)
memset(pImagedata,0,size);
else{
fclose(f);
return;
}
读入数据包,倒序读入文件中行的字节数与Memory行的字节数
intw4b=(iImagew*iYRGBnum+3)/4*4;
BYTE*ptr=new[w4b];
if(ptr==NULL){
fclose(f);
return;
}
inti=0;
BYTE*p=NULL;
for(i=iImageh-1;i>=0;i--){
fread(ptr,w4b,1,f);
p=pImageData+i*iImagew;
memmove(p,ptr,imagew);
}
delete[]ptr;
intj;
for(i=0;i<iImageh;i++){
p=pImageData+i*iImageW;
for(j=0;j<iImagew;j++){
printf(“%i\n”,*(p+j));
}
printf(“\n”);
}
代码结尾:
fclose(f);
if(pImageData){
delete[]pImageData;
}
printf(“Thisistheend!”);
}
以上就是关于如何将BMP文件调入到Memory中的代码,希望对uu有所帮助