一、CBmpFile类的构造函数CBmpFile::CBmpFile(),当创建一个CBmpFile类对象时候自动运行的。
CBmpFile::CBmpFile()
{
m_pImgDat=NULL; //BYTE* m_pImgDat; //指向图像数据的指针
m_Cols=m_Rows=m_PxlBytes =0;//行、列、像素赋初值
m_pBmpInfo = new BYTE[ sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256];//位图文件信息头的指针大小初始化。
memset( m_pBmpInfo,0,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 );
RGBQUAD *pColorTab = (RGBQUAD *)(m_pBmpInfo+sizeof(BITMAPINFOHEADER));
for( int i=0;i<256;i++ )
{
pColorTab[i].rgbRed=pColorTab[i].rgbGreen=pColorTab[i].rgbBlue=i;//将pColorTab中的值初始化。
}
}
1、memset, 函数原型
void *memset(void *s, int ch, unsigned n);
将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。该函数设置m_pBmpInfo指针指向的地址块大小为位图文件信息头大小,全部设为值0. 2、RGBQUAD RGBQUAD是一个结构体,定义如下: typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
值得注意的是:RGBQUAD的颜色顺序是:B,G,R,Reserved(蓝绿红)
:RGBQUAD的颜色顺序是:B,G,R,Reserved(蓝绿红)
<span style="color:#ff0000">二、析构函数CBmpFile::~CBmpFile()</span>
CBmpFile::~CBmpFile()
{
if (m_pImgDat)
delete []m_pImgDat;
m_pImgDat=NULL;
if( m_pBmpInfo )
delete []m_pBmpInfo;
m_pBmpInfo=NULL;
}
如果m_pImgDat定义了,不为空,则删除。m_pBmpInfo同理。作用为自动释放空间,在程序结束时候自动运行。
<span style="color:#ff0000">三、重载运算符[]函数BYTE* CBmpFile::operator[](int nIndex)</span>
BYTE* CBmpFile::operator[](int nIndex)
{
return (m_pImgDat+nIndex*m_Cols);
}
使得该运算符[]具有使m_pImgDat再加上nIndex列的功能。
<span style="color:#ff0000">四、创建BmpFile函数 BOOL CBmpFile::CreateBmp(int cols,int rows,int pixelPytes)</span>
BOOL CBmpFile::CreateBmp(int cols,int rows,int pixelPytes)
{
if (m_pImgDat)
delete []m_pImgDat; //如果m_pImgDat已经存在了,删除空间。
m_pImgDat = new BYTE[cols*rows*pixelPytes]; //给m_pImgDat创建空间大小为--行乘列乘像素大小
memset( m_pImgDat,0,cols*rows*pixelPytes ); //给m_pImgDat所指空间行乘列乘像素大小赋值0
m_Cols=cols;
m_Rows=rows;
m_PxlBytes=pixelPytes;
return TRUE;
}
<span style="color:#ff0000">五、重载运算符=函数 const CBmpFile& CBmpFile::operator=(CBmpFile& bmpFile)</span>
const CBmpFile& CBmpFile::operator=(CBmpFile& bmpFile)
{
CreateBmp( bmpFile.m_Cols,bmpFile.m_Rows,bmpFile.m_PxlBytes);
memcpy( m_pImgDat,bmpFile.m_pImgDat,m_Cols*m_Rows*m_PxlBytes );
memcpy( m_pBmpInfo,bmpFile.m_pBmpInfo,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 );
return (*this);
}