#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)//計(jì)算圖像每行象素所占的字節(jié)數(shù)目; HANDLE m_hDIB;//存放位圖數(shù)據(jù)的句柄; CPalette* m_palDIB;//指向調(diào)色板Cpalette類的指針; CSize m_sizeDoc;//初始化視圖的尺寸,該尺寸為位圖的尺寸; |
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName) { LOGPALETTE *pPal;//定義邏輯調(diào)色板指針; pPal=new LOGPALETTE;//初始化該指針; CFile file; CFileException fe; if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe)) {//以“讀”的方式打開文件; AfxMessageBox("圖像文件打不開!"); return FALSE; } DeleteContents();//刪除文擋; BeginWaitCursor(); BITMAPFILEHEADER bmfHeader;//定義位圖文件頭結(jié)構(gòu); LPBITMAPINFO lpbmi; DWORD dwBitsSize; HANDLE hDIB; LPSTR pDIB;//指向位圖數(shù)據(jù)的指針; BITMAPINFOHEADER *bmhdr;//指向位圖信息頭結(jié)構(gòu)的指針 dwBitsSize = file.GetLength();//得到文件長度 if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=sizeof(bmfHeader)) return FALSE;//讀取位圖文件的文件頭結(jié)構(gòu)信息; if (bmfHeader.bfType != 0x4d42) //檢查該文件是否為BMP格式的文件; return FALSE; hDIB=(HANDLE) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize); //為讀取圖像文件數(shù)據(jù)申請(qǐng)緩沖區(qū) if (hDIB == 0) { return FALSE; } pDIB = (LPSTR) ::GlobalLock((HGLOBAL)hDIB); //得到申請(qǐng)的緩沖區(qū)的指針; if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) != dwBitsSize - sizeof(BITMAPFILEHEADER) ) { ::GlobalUnlock((HGLOBAL)hDIB); hDIB=NULL; return FALSE; }//此時(shí)pDIB數(shù)據(jù)塊中讀取的數(shù)據(jù)包括位圖頭信息、位圖顏色表、圖像像素的灰度值; bmhdr=(BITMAPINFOHEADER*)pDIB;//為指向位圖信息頭結(jié)構(gòu)的指針賦值; ::GlobalUnlock((HGLOBAL)hDIB); if ((*bmhdr).biBitCount!=8)//驗(yàn)證是否為8bit位圖 { AfxMessageBox("該文件不是灰度位圖格式!"); return FALSE; } m_hDIB=hDIB;//將內(nèi)部變量數(shù)據(jù)賦于全局變量; //下面是記錄位圖的尺寸; m_sizeDoc.x=bmhdr->biWidth; m_sizeDoc.y=bmhdr->biHeight; //下面是根據(jù)顏色表生成調(diào)色板; m_palDIB=new Cpalette; pPal->palVersion=0x300;//填充邏輯顏色表 pPal->palNumEntries=256; lpbmi=(LPBITMAPINFO)bmhdr; for(int i=0;i<256;i++) {//每個(gè)顏色表項(xiàng)的R、G、B值相等,并且各個(gè)值從“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); //根據(jù)讀入的數(shù)據(jù)得到位圖的寬、高、顏色表; if(pPal) delete pPal; EndWaitCursor(); SetPathName(lpszPathName);//設(shè)置存儲(chǔ)路徑 SetModifiedFlag(FALSE); // 設(shè)置文件修改標(biāo)志為FALSE return TRUE; } |
///////////////////////////////////////////////////////////////// HANDLE LoadDIB(UINT uIDS, LPCSTR lpszDibType) { LPCSTR lpszDibRes =MAKEINTRESOURCE(uIDS);//根據(jù)資源標(biāo)志符確定資源的名字; HINSTANCE hInst=AfxGetInstanceHandle();//得到應(yīng)用程序的句柄; HRSRC hRes=::FindResource(hInst,lpszDibRes, lpszDibType);//獲取資源的句柄,這里lpszDibType為資源的名字“DIB”; If(hRes==NULL) return NULL HGLOBAL hData=::LoadResource(hInst, hRes);//轉(zhuǎn)載資源數(shù)據(jù)并返回該句柄; return hData; } |
/////////////////////////////////////////////////////////////////// BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName) { CFile file; CFileException fe; BITMAPFILEHEADER bmfHdr; // 位圖文件頭結(jié)構(gòu); LPBITMAPINFOHEADER lpBI;//指向位圖頭信息結(jié)構(gòu)的指針; 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); //圖像的文件信息所占用的字節(jié)數(shù); DWORD dwBmBitsSize;//BMP文件中位圖的像素所占的字節(jié)數(shù) dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) *lpBI->biHeight;// 存儲(chǔ)時(shí)位圖所有像素所占的總字節(jié)數(shù) dwDIBSize += dwBmBitsSize; //BMP文件除文件信息結(jié)構(gòu)外的所有數(shù)據(jù)占用的總字節(jié)數(shù); lpBI->biSizeImage = dwBmBitsSize; // 位圖所有像素所占的總字節(jié)數(shù) //以下五句為文件頭結(jié)構(gòu)填充值 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); //位圖數(shù)據(jù)距離文件頭的偏移量; file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));//向文件中寫文件頭信息; file.WriteHuge(lpBI, dwDIBSize); //將位圖信息(信息頭結(jié)構(gòu)、顏色表、像素?cái)?shù)據(jù))寫入文件; ::GlobalUnlock((HGLOBAL) m_hDIB); EndWaitCursor(); SetModifiedFlag(FALSE); // 將文檔設(shè)為“干凈”標(biāo)志,表示此后文檔不需要存盤提示; return TRUE; } |
聯(lián)系客服