512
技術社區[雲棲]
CBitmap的使用
MFC提供了位圖處理的基礎類CBitmap,可以完成位圖(bmp圖像)的創建、圖像數據的獲取等功能。雖然功能比較少,但是在對位圖進行一些簡單的處理時,CBitmap類還是可以勝任的。很多人可能會采用一些現成的CDib類進行位圖的讀取與處理,我覺得必要性不大。因為他們完成的功能差不多。
以下假設定義了數據成員:
CBitmap m_bitmap;
(1) 位圖的讀取
void LoadImage(CString fileName)
{
HBITMAP m_hBitmap;//位圖句柄
BITMAP bm;//存放位圖信息的結構
m_hBitmap = (HBITMAP)::LoadImage(NULL,fileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //裝載位圖
if(m_bitmap.m_hObject)
m_bitmap.DeleteObject();
m_bitmap.Attach(m_hBitmap);//將句柄與CBitmap關聯起來
m_bitmap.GetBitmap(&bm);
height = bm.bmHeight;//圖像的寬高
width = bm.bmWidth;
widthBytes=bm.bmWidthBytes;//圖像一行數據所占的字節數
}
(2) 位圖的顯示
在OnDraw()或OnPaint()函數中調用:
//dx0,dy0,dx,dy為顯示目標位置的坐標和大小,
//sx0,sy0,sx,sy為圖像要顯示部分的起始坐標和大小
void DrawImage(int dx0, int dy0, int dx, int dy, int sx0, int sy0, int sx, int sy)
{ if(!m_bitmap.m_hObject)
return;
CClientDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap* pbmpOld = memDC.SelectObject(&m_bitmap);
dc.SetStretchBltMode(COLORONCOLOR);//設置拉伸模式,否則圖像會不清晰
dc.StretchBlt(dx0,dy0,dx,dy,&memDC,sx0,sy0,sx,sy,SRCCOPY);//繪製圖像
memDC.SelectObject(pbmpOld);
memDC.DeleteDC();
}
(3) 位圖數據的獲取
以灰度轉化為例:
int size=height*widthBytes;
BYTE *lpBits=new BYTE[size];
m_bitmap.GetBitmapBits(size,lpBits);//得到RGB數據
BYTE *lpGray=new BYTE[height*width];
int R, G, B;
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
B=lpBits[i*widthBytes+j*4];
G=lpBits[i*widthBytes+j*4+1];
R=lpBits[i*widthBytes+j*4+2];
lpGray[i*width+j]=(B+G+R)/3;//轉化為灰度
}
...
delete []lpBits;
delete []lpGray;
最後更新:2017-04-03 16:48:39