/**************************************** ******************************* * 函数名称: * ImgCenterDib() * *说明:无参数的构造函数,对成员变量进行初始化, 创建一个对象 ******************************************* ****************************/ ImgCenterDib::ImgCenterDib() { m_lpDib=NULL;//初始化m_lpDib为空 m_lpColorTable=NULL;//颜色表指针为空 m_pImgData=NULL; //图像数据指针为空 m_lpBmpInfoHead=NULL; //图像信息头指针为空 m_hPalette = NULL;//调色板为空 } /**************************************** ******************************* * 函数名称: * ImgCenterDib() * *函数参数: * CSize size-图像大小(宽、高) * int nBitCount-每像素所占位数 * LPRGBQUAD lpColorTable-颜色表指针 * unsigned char *pImgData-位图数据指针 * *返回值: * 无 * *说明:本函数为带参数的构造函数,给定位图的大小、 每像素位数、颜色表 * 及位图数据等信息,创建ImgCenterDib类的对象 ******************************************** ***************************/ ImgCenterDib::ImgCenterDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable, unsigned char *pImgData) { //如果没有位图数据传入,我们认为是空的DIB,此时不分配DIB内存 if(pImgData==NULL){ m_lpDib=NULL; m_lpColorTable=NULL; m_pImgData=NULL; m_lpBmpInfoHead=NULL; m_hPalette = NULL; } else{//如果有位图数据传入 //为图像的宽、高、每像素位数等成员变量赋值 m_imgWidth=size.cx; m_imgHeight=size.cy; m_nBitCount=nBitCount; //根据每像素位数,计算颜色表长度 m_nColorTableLength=ComputeColorTabalLength(nBitCount); //每行像素所占字节数,必须扩展成4的倍数 int lineByte=(m_imgWidth*nBitCount/8+3)/4*4; //位图数据缓冲区的大小(图像大小) int imgBufSize=m_imgHeight*lineByte; //为m_lpDib一次性分配内存,生成DIB结构 m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength+imgBufSize]; //填写BITMAPINFOHEADER结构 m_lpBmpInfoHead = (LPBITMAPINFOHEADER) m_lpDib; m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER); m_lpBmpInfoHead->biWidth = m_imgWidth; m_lpBmpInfoHead->biHeight = m_imgHeight; m_lpBmpInfoHead->biPlanes = 1; m_lpBmpInfoHead->biBitCount = m_nBitCount; m_lpBmpInfoHead->biCompression = BI_RGB; m_lpBmpInfoHead->biSizeImage = 0; m_lpBmpInfoHead->biXPelsPerMeter = 0; m_lpBmpInfoHead->biYPelsPerMeter = 0; m_lpBmpInfoHead->biClrUsed = m_nColorTableLength; m_lpBmpInfoHead->biClrImportant = m_nColorTableLength; //调色板句柄初始化为空,有颜色表时,MakePalette() 函数要创建新的逻辑调色板 m_hPalette = NULL; if(m_nColorTableLength!=0){ //若有颜色表, 则将颜色表拷贝进DIB的颜色表位置 //用m_lpColorTable指向DIB颜色表的起始位置 m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof (BITMAPINFOHEADER)); //颜色表拷贝 memcpy(m_lpColorTable,lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength); //创建逻辑调色板 MakePalette(); } //用m_pImgData指向DIB位图数据起始位置 m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * m_nColorTableLength; //拷贝图像数据进DIB位图数据区 memcpy(m_pImgData,pImgData,imgBufSize); } } /************************************** ********************************* * 函数名称: * ~ImgCenterDib() * *说明:析构函数,释放资源 ************************************ ***********************************/ ImgCenterDib::~ImgCenterDib() { //释放m_lpDib所指向的内存缓冲区 if(m_lpDib != NULL) delete [] m_lpDib; //如果有调色板,释放调色板缓冲区 if(m_hPalette != NULL) ::DeleteObject(m_hPalette); } |