資源描述:
《VC開發(fā)灰度位圖處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、VisualC++6.0開發(fā)灰度位圖處理9/10/20019:41:14··劉濤蔣建國··yesky圖像處理技術(shù)已經(jīng)類生活的各個(gè)領(lǐng)域并得到越來越多的應(yīng)用,圖像處理所涉及的圖像格式有很多種,如TIF、JEMP、BMP等等,工程應(yīng)用中經(jīng)常要處理256級(jí)的灰度BMP圖像,如通過黑白采集卡采集得到的圖像。BMP灰度圖像作為Windows環(huán)境下主要的圖像格式之一,以其格式簡單,適應(yīng)性強(qiáng)而倍受歡迎。在進(jìn)行圖像處理時(shí),操作圖像中的像素值就要得到圖像陣列;經(jīng)過處理后的圖像的像素值存儲(chǔ)起來;顯示圖像時(shí)要正確實(shí)現(xiàn)調(diào)色板,結(jié)合這些問題,文章針對(duì)性的給出了操作灰度
2、BMP圖像時(shí)的部分函數(shù)實(shí)現(xiàn)代碼及注釋。 一、BMP位圖操作 BMP位圖包括位圖文件頭結(jié)構(gòu)BITMAPFILEHEADER、位圖信息頭結(jié)構(gòu)BITMAPINFOHEADER、位圖顏色表RGBQUAD和位圖像素?cái)?shù)據(jù)四部分。處理位圖時(shí)要根據(jù)文件的這些結(jié)構(gòu)得到位圖文件大小、位圖的寬、高、實(shí)現(xiàn)調(diào)色板、得到位圖像素值等等。對(duì)于256級(jí)灰度圖像每個(gè)像素用8bit表示顏色的索引值,這里要注意的一點(diǎn)是在BMP位圖中,位圖的每行像素值要填充到一個(gè)四字節(jié)邊界,即位圖每行所占的存儲(chǔ)長度為四字節(jié)的倍數(shù),不足時(shí)將多余位用0填充?! ≡谔幚韴D像應(yīng)用程序的文檔類(Cdi
3、bDoc.h)中聲明如下宏及公有變量: #defineWIDTHBYTES(bits)(((bits)+31)/32*4)//計(jì)算圖像每行象素所占的字節(jié)數(shù)目 HANDLEm_hDIB;//存放位圖數(shù)據(jù)的句柄 CPalette*m_palDIB;//指向調(diào)色板Cpalette類的指針 CSizem_sizeDoc;file://初始化視圖的尺寸 1、讀取灰度BMP位圖 根據(jù)BMP位圖文件的結(jié)構(gòu),操作BMP位圖文件讀入數(shù)據(jù),重載了文擋類的OnOpenDocument函數(shù)如下:BOOLCDibDoc::OnOpenDocument(L
4、PCTSTRlpszPathName){ CFilefile; CFileExceptionfe; if(!file.Open(lpszPathName,CFile::modeRead
5、CFile::shareDenyWrite,&fe)) { AfxMessageBox("文件打不開"); return8FALSE; }//打開文件 DeleteContents();//刪除文擋 BeginWaitCursor(); BITMAPFILEHEADERbmfHeader;//定義位圖文件頭結(jié)構(gòu) DWORDdwBitsSize; HAN
6、DLEhDIB; LPSTRpDIB; BITMAPINFOHEADER*bmhdr;//指向位圖信息頭結(jié)構(gòu)的指針 dwBitsSize=file.GetLength();//得到文件長度 if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!= sizeof(bmfHeader)) returnFALSE; if(bmfHeader.bfType!=0x4d42)file://檢查是否為BMP文件 returnFALSE; hDIB=(HANDLE)::Gl
7、obalAlloc(GMEM_MOVEABLE
8、 GMEM_ZEROINIT,dwBitsSize); file://申請(qǐng)緩沖區(qū) if(hDIB==0) { returnFALSE; } pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); file://得到申請(qǐng)的緩沖區(qū)的指針 if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!= dwBitsSize-sizeof(BITM
9、APFILEHEADER)) { ::GlobalUnlock((HGLOBAL)hDIB); hDIB=NULL; returnFALSE; }//讀數(shù)據(jù),包括位圖信息、位圖顏色表、圖像像素的灰度值 bmhdr=(BITMAPINFOHEADER*)pDIB;//為指向位圖信息頭結(jié)構(gòu)的指針付值 ::GlobalUnlock((HGLOBAL)hDIB); if((*bmhdr).biBitCount!=8)file://驗(yàn)證是否為8bit位圖 returnFALSE; m_hDIB=hD
10、IB; InitDIBData(); file://自定義函數(shù),根據(jù)讀入的數(shù)據(jù)得到位圖的寬、高、顏色表 file://來得到初始化視的尺寸、生成調(diào)色板 E