/****************************************** ***************************** * 函数名称: * Read() * *函数参数: * LPCTSTR lpszPathName-文件名字及路径 * *返回值: * 0为失败,1为成功 * *说明:给定一个图像文件名及其路径,分配内存,读取 图像数据进内存生成DIB, * 并存放在m_lpDib所指向的缓冲区 ********************************************** *************************/ BOOL ImgCenterDib::Read(LPCTSTR lpszPathName) { //读模式打开图像文件 CFile file; if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite)) return FALSE; BITMAPFILEHEADER bmfh; try { //清理空间 Empty(); //读取BITMAPFILEHEADER结构到变量bmfh中 int nCount=file.Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); //异常判断 if(nCount != sizeof(BITMAPFILEHEADER)) { throw new CException; } if(bmfh.bfType != 0x4d42) { throw new CException; } //为m_lpDib分配空间,读取DIB进内存 if(m_lpDib!=NULL) delete []m_lpDib; m_lpDib=new BYTE[file.GetLength() -sizeof(BITMAPFILEHEADER)]; file.Read(m_lpDib, file.GetLength() -sizeof(BITMAPFILEHEADER)); //m_lpBmpInfoHead位置为m_lpDib起始位置 m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib; //为成员变量赋值 m_imgWidth=m_lpBmpInfoHead->biWidth; m_imgHeight=m_lpBmpInfoHead->biHeight; m_nBitCount=m_lpBmpInfoHead->biBitCount; //计算颜色表长度 m_nColorTableLength= ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount); //生成逻辑调色板 m_hPalette = NULL; if(m_nColorTableLength!=0){ m_lpColorTable=(LPRGBQUAD) (m_lpDib+sizeof(BITMAPINFOHEADER)); MakePalette(); } //m_pImgData指向DIB的位图数据起始位置 m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength; } catch(CException* pe) { AfxMessageBox("Read error"); pe->Delete(); return FALSE; } //函数返回 return TRUE; } |