天天看點

【數字圖像處理】一.MFC詳解顯示BMP格式圖檔

本文主要是講述《數字圖像處理》系列欄目中的第一篇文章.主要詳細介紹了bmp圖檔格式,同時使用c++和mfc顯示bmp格式,主要結合自己的《數字圖像處理》課程和以前的項目叙述講解.

bmp檔案格式是windows作業系統推薦和支援的标準圖像檔案格式,是一種将記憶體或顯示器的圖像資料不經過壓縮而直接按位存盤的檔案格式,故稱位圖(bitmap),其擴充名為bmp.bmp圖像通常有4個部分組成:位圖檔案頭、位圖資訊頭、顔色表、位圖資料.如下圖所示:

【數字圖像處理】一.MFC詳解顯示BMP格式圖檔

第一部分為位圖檔案頭bitmapfileheader.位圖檔案頭結構長度固定為14個位元組,包含檔案的類型、大小、位圖檔案保留字、位圖資料距檔案頭的偏移量.其中word為無符号16位整數(2byte),dword為無符号32位整數(4byte).具體結構體定義如下:

第二部分為位圖資訊頭bitmapinfoheader,該結構也固定為40個位元組,用于說明位圖的尺寸、寬高、像素、分辨率、顔色表等資訊.具體結構定義如下:

第三部分為顔色表或調色闆(palette).有些位圖需要調色闆,有些位圖如真彩色圖(bibitcount=24)不需要調色闆,它們的bitmapinfoheader後面直接是位圖資料.調色闆實際是一個數組,共有biclrused個元素(如果該值為零,則有2的bibitcount次幂個元素).數組中每個元素的類型是一個rgbquad結構,占4位元組.定義如下:

第四部分就是實際的圖像資料.對于真彩色圖(24位位圖 bibitcount=24),圖像資料就是實際的rgb值;對于用到調色闆的位圖,圖像資料就是該像素顔色在調色闆中的索引值.下面對2色、16色、256色和真彩色位圖分别介紹:

(1).2色位圖:當bibitcount=1時,用1位就可以表示該像素的顔色(0表示黑,1表示白),是以8個像素占1個位元組;

(2).16色位圖:當bibitcount=4時,用4為可以表示一個像素的顔色,是以2個像素占1個位元組;

(3).256色位圖:當bibitcount=8時,用1個位元組表示1個像素,1個像素占1個位元組;

(4).真彩色圖:當bibitcount=24時,此時用3個位元組表示1個像素,其中rgb各占1位元組,由于沒有顔色表,位圖資訊頭後面是位圖資料.

同時,注意以下幾點:

1.由于windows規定一個掃描所占的位元組數必須是4的倍數(即以long為機關),不足的以0填充.同時注意下面公式,計算隻含位圖資料的大小:bisizeimage=(((bi.biwidth*bi.bibitcount)+31)/(32*4))*bi.height

在後面講述擷取檔案的資訊時會通過ue軟體結合16進制資料進行詳細講解上面各個資料的具體含義.

2.bmp圖檔格式的資料是從下到上、從左到右讀.即檔案中最先讀到的圖像是最下面一行的左邊第一個元素,即從左下角開始存儲(0,0)點,從左下角到右上角存儲資料.尤其是在圖像幾何變換平移、旋轉時,我就犯過這樣的錯誤,本想讓圖像從左下角向右上移動,結果剛好相反,後面也會通過執行個體加深大家的印象.

3.如果想使用c語言\c++顯示圖檔,建議自定義個imagestruct.h的頭檔案.包含bmp位圖的位圖檔案頭結構、位圖資訊頭結構、位圖顔色表3個結構,在執行個體變量操作.而使用mfc,因為在wingdi.h檔案中系統已經定義了bmp圖像的結構bitmapfileheader、bitmapinfoheader,直接在view.h中用他倆執行個體定義即可.

在mfc工程xxxview.h類中添加成員函數void showbitmap(cdc* pdc,cstring bmpname);通過自定義函數實作顯示bmp格式圖像,其中*pdc是cdc句柄,bmpname是圖像檔案名.具體步驟如下:

1.建立位圖并調用函數loadimage裝載圖示、光标或位圖.

  hbitmap m_hbitmap; 

  m_hbitmap=(hbitmap)loadimage(hinstance hinst,lpctstr lpszname,uint utype,int cxdesired,int cydesired,uint fuload)

2.定義并建立一個記憶體裝置環境dc,調用函數createcompatibledc建立相容的dc.

  cdc dcbmp; dcbmp.createcompatibledc(pdc) ;

3.定義bitmap變量,調用函數getbitmap将圖檔載入位圖中,該定義是為後去圖像的長寬等資訊.

  bitmap m_bmp; m_bitmap.getbitmap(&m_bmp);

4.調用函數selectobject将位圖選入相容記憶體裝置環境dc中.

  dcbmp.selectobject(&m_bitmap);

5.将相容的dc中的位圖填到目前dc中,調用函數bitblt或strechblt顯示圖像.

(1).bitblt()該函數對指定的源裝置環境區域中的像素進行位塊(bit_block)轉換,以傳送到目标裝置環境.

  pdc->bitblt(0,0,m_bmp.bmwidth,m_bmp.bmheight,&dcbmp,0,0,srccopy);

(2).stretchblt()該函數從源矩形中複制位圖到目标矩形,必要是按目标裝置設定的模式進行圖像拉伸或壓縮.

  pdc->stretchblt(0,0,m_ndrawwidth,m_ndrawheight,&dcbmp,0,0,m_bmp.bmwidth,m_bmp.bmheight,srccopy);

6.恢複臨時dc的位圖,删除createcompatibledc得到的圖檔dc,删除記憶體中的位圖及釋放系統資源.

  dcbmp.selectobject(pbmpold); deleteobject(&m_bitmap);  dcbmp.deletedc();

具體函數代碼如下:

下面将詳細講解使用vs2012 mfc建立工程的具體步驟:

第一步:建立項目"mfc應用程式",項目名為showbmp,在應用程式類型中選擇"單個文檔",點選"确定".在右欄的"資源視圖"中,點選"menu->idr_mainfram"可以檢視并修改菜單視圖.

第二步:向cshowbmpview類添加成員變量和成員函數.在右欄的"類視圖"右鍵cshowbmpview添加函數或直接在showbmpview.h中直接添加public成員變量和成員函數.添加代碼如下:

第三步:設定打開bmp圖檔函數."項目"->"類向導"->選擇"類名"cshowbmpview->在指令對象id中輕按兩下"id_file_open"->自動生成預設成員函數onfileopen,消息為command.輕按兩下成員函數(member functions)進入函數編輯.(vc++ 6.0中ctrl+w可以實作建立類向導)

【數字圖像處理】一.MFC詳解顯示BMP格式圖檔

向添加成員函數cshowbmpview::onfileopen()添加如下代碼,主要是生成打開圖檔的對話框,并擷取圖檔路徑及字尾.自定義四種格式為bmp gif jpg tiff,但目前隻能打開bmp格式圖檔.

第四步:在showbmpview.cpp中編寫void cshowbmpview::showbitmap(cdc *pdc, cstring bmpname)函數,即“二.顯示bmp圖檔基本步驟”.同時通過ondraw()函數調用showbitmap()函數顯示圖檔.代碼如下:

運作程式後,顯示如下所示:其中可以看到自定義的打開對話框和顯示圖檔.

【數字圖像處理】一.MFC詳解顯示BMP格式圖檔
【數字圖像處理】一.MFC詳解顯示BMP格式圖檔

<a target="_blank" href="http://download.csdn.net/detail/eastmount/6848841">http://download.csdn.net/detail/eastmount/6848841</a>

希望該文章能夠對大家有所幫助,同時如果文章中有錯誤或不足之處,還請大家海涵.

繼續閱讀