/**************************************** ******************************* * 函数名称: * ReplaceDib() * *函数参数: * CSize size-要替换的新图像尺寸 * int nBitCount-每像素的位数 * LPRGBQUAD lpColorTable-颜色表指针 * unsigned char *pImgData-位图数据的指针 *返回值: * 无 * *说明:给定新图像的尺寸、每像素位数、颜色表及 位图数据等信息,将m_lpDib * 所指向的现有的DIB替换成新的DIB **************************************** *******************************/ void ImgCenterDib::ReplaceDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,unsigned char *pImgData) { //释放原DIB所占空间 Empty(); //成员变量赋值 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; //调色板置空 m_hPalette = NULL; //如果有颜色表,则将颜色表拷贝至新生成的DIB, 并创建逻辑调色板 if(m_nColorTableLength!=0){ 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); } |