www.pudn.com > bmpfile.rar > BMP.cpp


#include "BMP.h" 
 
myBmp::myBmp(char *pathname) 
{ 
	this->PathName=pathname; 
	this->Bmpfp=fopen(pathname,"rb"); 
	this->bmfHdr= new BITMAPFILEHEADER; 
	this->bmiHdr= new BITMAPINFOHEADER; 
	this->bmfHdr->bfType=(WORD)0x4D42; 
	this->bmfHdr->bfReserved1=0; 
	this->bmfHdr->bfReserved2=0; 
	this->bmfHdr->bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));; 
	this->bmiHdr->biSize=sizeof(BITMAPINFOHEADER); 
	this->bmiHdr->biPlanes=1; 
	this->bmiHdr->biBitCount=24; 
	this->bmiHdr->biCompression=BI_RGB; 
	this->bmiHdr->biSizeImage=0; 
	this->bmiHdr->biXPelsPerMeter=0xb12; 
	this->bmiHdr->biYPelsPerMeter=0xb12; 
	this->bmiHdr->biClrUsed=0; 
	this->bmiHdr->biClrImportant=0; 
} 
 
myBmp::~myBmp() 
{ 
	delete bmfHdr; 
	delete bmiHdr; 
	delete [this->bmiHdr->biHeight*this->bmiHdr->biWidth]Data; 
	fclose(this->Bmpfp); 
} 
 
void myBmp::Wrtie(char *SaveAs) 
{ 
	FILE *fp; 
	if((fp=fopen(SaveAs,"wb"))==NULL){printf("error!");return;} 
	fwrite(this->bmfHdr,sizeof(BITMAPFILEHEADER),1,fp); 
	fwrite(this->bmiHdr,sizeof(BITMAPINFOHEADER),1,fp); 
	if(this->bmiHdr->biBitCount!=24) 
	fwrite(this->rgbQuad,sizeof(RGBQUAD),1,fp); 
	for(int i=0;ibmiHdr->biHeight*this->bmiHdr->biWidth*3;i++) 
	{ 
		fwrite(this->Data+i+2,sizeof(char),1,fp); 
		fwrite(this->Data+i+1,sizeof(char),1,fp); 
		fwrite(this->Data+i,sizeof(char),1,fp); 
		i+=2; 
	} 
	fclose(fp); 
} 
 
void myBmp::Open(char *pathname) 
{ 
	this->PathName=pathname; 
	this->Bmpfp=fopen(pathname,"rb"); 
} 
 
void myBmp::Read() 
{ 
	fread(this->bmfHdr,sizeof(BITMAPFILEHEADER),1,this->Bmpfp); 
	fread(this->bmiHdr,sizeof(BITMAPINFOHEADER),1,this->Bmpfp); 
	 
	if(this->bmiHdr->biBitCount!=24) 
		fread(&(this->rgbQuad),sizeof(RGBQUAD),256,this->Bmpfp); 
 
	Data = new char[this->bmiHdr->biHeight*this->bmiHdr->biWidth];  
	fread(this->Data,sizeof(char),this->bmiHdr->biHeight*this->bmiHdr->biWidth,this->Bmpfp); 
	fclose(Bmpfp); 
} 
 
void myBmp::SetFileH(unsigned long size) 
{ 
	this->bmfHdr->bfSize=size*3+56; 
} 
 
void myBmp::SetInfoH(long x,long y) 
{ 
	this->bmiHdr->biWidth=x; 
	this->bmiHdr->biHeight=y; 
} 
 
void myBmp::SetRGBData(char *data) 
{ 
	this->Data=data; 
} 
 
void *myBmp::Get(int type) 
{ 
	switch(type) 
	{ 
	case FILEHEADER:	return this->bmfHdr; 
	case INFOHEADER:	return this->bmiHdr; 
	case RGBPAL:		return this->rgbQuad; 
	case RGBDATA:		return this->Data; 
	case FILEPOINT:		return this->Bmpfp; 
	case PATHNAME:		return this->PathName; 
	default:			return NULL; 
	} 
}