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;
}
}