VC++中图像处理类CBitmap的用法
VC++中图像处理类CBitmap的用法
classCBitmap:publicCGdiObject { DECLARE_DYNAMIC(CBitmap) public: staticCBitmap*PASCALFromHandle(HBITMAPhBitmap); //Constructors CBitmap(); BOOLLoadBitmap(LPCTSTRlpszResourceName); BOOLLoadBitmap(UINTnIDResource); BOOLLoadOEMBitmap(UINTnIDBitmap);//forOBM_/OCR_/OIC_ #ifndef_AFX_NO_AFXCMN_SUPPORT BOOLLoadMappedBitmap(UINTnIDBitmap,UINTnFlags=0, LPCOLORMAPlpColorMap=NULL,intnMapSize=0); #endif BOOLCreateBitmap(intnWidth,intnHeight,UINTnPlanes,UINTnBitcount, constvoid*lpBits); BOOLCreateBitmapIndirect(LPBITMAPlpBitmap); BOOLCreateCompatibleBitmap(CDC*pDC,intnWidth,intnHeight); BOOLCreateDiscardableBitmap(CDC*pDC,intnWidth,intnHeight); //Attributes operatorHBITMAP()const; intGetBitmap(BITMAP*pBitMap); //Operations DWORDSetBitmapBits(DWORDdwCount,constvoid*lpBits); DWORDGetBitmapBits(DWORDdwCount,LPVOIDlpBits)const; CSizeSetBitmapDimension(intnWidth,intnHeight); CSizeGetBitmapDimension()const; //Implementation public: virtual~CBitmap(); #ifdef_DEBUG virtualvoidDump(CDumpContext&dc)const; #endif };
父
CGdiObject
classCGdiObject:publicCObject { DECLARE_DYNCREATE(CGdiObject) public: //Attributes HGDIOBJm_hObject;//mustbefirstdatamember operatorHGDIOBJ()const; HGDIOBJGetSafeHandle()const; staticCGdiObject*PASCALFromHandle(HGDIOBJhObject); staticvoidPASCALDeleteTempMap(); BOOLAttach(HGDIOBJhObject); HGDIOBJDetach(); //Constructors CGdiObject();//mustCreateaderivedclassobject BOOLDeleteObject(); //Operations #pragmapush_macro("GetObject") #undefGetObject int_AFX_FUNCNAME(GetObject)(intnCount,LPVOIDlpObject)const; intGetObject(intnCount,LPVOIDlpObject)const; #pragmapop_macro("GetObject") UINTGetObjectType()const; BOOLCreateStockObject(intnIndex); BOOLUnrealizeObject(); BOOLoperator==(constCGdiObject&obj)const; BOOLoperator!=(constCGdiObject&obj)const; //Implementation public: virtual~CGdiObject(); #ifdef_DEBUG virtualvoidDump(CDumpContext&dc)const; virtualvoidAssertValid()const; #endif };
1装载已导入工程的位图资源
//装载位图 CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP);
2装载位图文件
为了能让CBitmap能够装载位图文件,必须调用API函数LoadImage
HANDLELoadImage( HINSTANCEhinst,//handleoftheinstancecontainingtheimage LPCTSTRlpszName,//nameoridentifierofimage UINTuType,//typeofimage intcxDesired,//desiredwidth intcyDesired,//desiredheight UINTfuLoad//loadflags );
装载:Example1:
HBITMAPhBmp=(HBITMAP)LoadImage(NULL, m_fileName, IMAGE_BITMAP, 0,0, LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);
Example2:
HBITMAPhBmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), "BG.bmp", IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);
将装载后得到的HBITMAP资源句柄与CBitmap对象相连
if(hBmp!=NULL){ CBitmap*pBmp=CBitmap::FromHandle(hBmp); }
或
CBitmapbmp; if(hBmp!=NULL){ bmp.DeleteObject(); bmp.Attach(hBmp); }
3显示位图
CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP1); BITMAPbm; bmp.GetBitmap(&bm); CDCdc; dc.CreateCompatibleDC(pDC); CBitmap*pOldBmp=(CBitmap*)dc.SelectObject(&bmp); pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY); pDC->SelectObject(pOldBmp); bmp.DeleteObject(); bmp.LoadBitmap(IDB_BITMAP2);
4删除资源
CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP); CBitmap*pOld=pDC->SelectObject(&bmp); //此时位图对象还在pDC中,因此不能马上删除 //而是先将位图从DC中选出然后再删除 pDC->SelectObject(pOld); bmp.DeleteObject();
5CBitmap析构
当CBitmap作为局部变量在其退出作用范围后,会发生析构,这时候CBitmap会将其对应的位图资源(hBitmap)释放掉。
若想继续使用该位图资源hBitmap,则在退出作用范围前,应将位图资源hBitmap和CBitmap对象通过Detach()函数进行分离
HBITMAP CMyClass::Load() { CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP);
//通过Detach将资源与对象分离,这样bmp析构后,资源仍存在 //否则,bmp析构时,会将位图资源一起析构掉,这样出了局部范围外,就不可再使用这个位图资源了 returnbmp.Detach(); }