扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:刘涛 来源:作者授权转载 2007年10月21日
关键字:
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)//计算图像每行象素所占的字节数目; HANDLE m_hDIB;//存放位图数据的句柄; CPalette* m_palDIB;//指向调色板Cpalette类的指针; CSize m_sizeDoc;//初始化视图的尺寸,该尺寸为位图的尺寸; |
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName) { LOGPALETTE *pPal;//定义逻辑调色板指针; pPal=new LOGPALETTE;//初始化该指针; CFile file; CFileException fe; if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe)) {//以“读”的方式打开文件; AfxMessageBox("图像文件打不开!"); return FALSE; } DeleteContents();//删除文挡; BeginWaitCursor(); BITMAPFILEHEADER bmfHeader;//定义位图文件头结构; LPBITMAPINFO lpbmi; DWORD dwBitsSize; HANDLE hDIB; LPSTR pDIB;//指向位图数据的指针; BITMAPINFOHEADER *bmhdr;//指向位图信息头结构的指针 dwBitsSize = file.GetLength();//得到文件长度 if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=sizeof(bmfHeader)) return FALSE;//读取位图文件的文件头结构信息; if (bmfHeader.bfType != 0x4d42) //检查该文件是否为BMP格式的文件; return FALSE; hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); //为读取图像文件数据申请缓冲区 if (hDIB == 0) { return FALSE; } pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); //得到申请的缓冲区的指针; if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) != dwBitsSize - sizeof(BITMAPFILEHEADER) ) { ::GlobalUnlock((HGLOBAL)hDIB); hDIB=NULL; return FALSE; }//此时pDIB数据块中读取的数据包括位图头信息、位图颜色表、图像像素的灰度值; bmhdr=(BITMAPINFOHEADER*)pDIB;//为指向位图信息头结构的指针赋值; ::GlobalUnlock((HGLOBAL)hDIB); if ((*bmhdr).biBitCount!=8)//验证是否为8bit位图 { AfxMessageBox("该文件不是灰度位图格式!"); return FALSE; } m_hDIB=hDIB;//将内部变量数据赋于全局变量; //下面是记录位图的尺寸; m_sizeDoc.x=bmhdr->biWidth; m_sizeDoc.y=bmhdr->biHeight; //下面是根据颜色表生成调色板; m_palDIB=new Cpalette; pPal->palVersion=0x300;//填充逻辑颜色表 pPal->palNumEntries=256; lpbmi=(LPBITMAPINFO)bmhdr; for(int i=0;i<256;i++) {//每个颜色表项的R、G、B值相等,并且各个值从“0”到“255”序列展开; Pal->palPalentry[i].peRed=lpbmi->bmiColors[i].rgbRed; pPal->palPalentry[i].peGreen=lpbmi->bmiColors[i].rgbGreen; pPal->palPalentry[i].peBlue= lpbmi->bmiColors[i].rgbBlue;; pPal->palPalentry[i].peFlags=0; } m_palDIB->CreatePalette(pPal); //根据读入的数据得到位图的宽、高、颜色表; if(pPal) delete pPal; EndWaitCursor(); SetPathName(lpszPathName);//设置存储路径 SetModifiedFlag(FALSE); // 设置文件修改标志为FALSE return TRUE; } |
///////////////////////////////////////////////////////////////// HANDLE LoadDIB(UINT uIDS, LPCSTR lpszDibType) { LPCSTR lpszDibRes =MAKEINTRESOURCE(uIDS);//根据资源标志符确定资源的名字; HINSTANCE hInst=AfxGetInstanceHandle();//得到应用程序的句柄; HRSRC hRes=::FindResource(hInst,lpszDibRes, lpszDibType);//获取资源的句柄,这里lpszDibType为资源的名字“DIB”; If(hRes==NULL) return NULL HGLOBAL hData=::LoadResource(hInst, hRes);//转载资源数据并返回该句柄; return hData; } |
/////////////////////////////////////////////////////////////////// BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName) { CFile file; CFileException fe; BITMAPFILEHEADER bmfHdr; // 位图文件头结构; LPBITMAPINFOHEADER lpBI;//指向位图头信息结构的指针; DWORD dwDIBSize;; if (!file.Open(lpszPathName, CFile::modeCreate |CFile::modeReadWrite | CFile::shareExclusive, &fe)) { AfxMessageBox("文件打不开"); return FALSE; }//以读写的方式打开文件; BOOL bSuccess = FALSE; BeginWaitCursor(); lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) m_hDIB); if (lpBI == NULL) return FALSE; dwDIBSize = *(LPDWORD)lpBI + 256*sizeof(RGBQUAD); //图像的文件信息所占用的字节数; DWORD dwBmBitsSize;//BMP文件中位图的像素所占的字节数 dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) *lpBI->biHeight;// 存储时位图所有像素所占的总字节数 dwDIBSize += dwBmBitsSize; //BMP文件除文件信息结构外的所有数据占用的总字节数; lpBI->biSizeImage = dwBmBitsSize; // 位图所有像素所占的总字节数 //以下五句为文件头结构填充值 bmfHdr.bfType =0x4d42; // 文件为"BMP"类型 bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);//文件总长度 bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + 256*sizeof(RGBQUAD); //位图数据距离文件头的偏移量; file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));//向文件中写文件头信息; file.WriteHuge(lpBI, dwDIBSize); //将位图信息(信息头结构、颜色表、像素数据)写入文件; ::GlobalUnlock((HGLOBAL) m_hDIB); EndWaitCursor(); SetModifiedFlag(FALSE); // 将文档设为“干净”标志,表示此后文档不需要存盘提示; return TRUE; } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者