VC编程之图像处理类CBitmap的用法

VC编程之图像处理类CBitmap的用法

2014-08-10 09:18:37|?次阅读|上传:huigezrx【已有?条评论】发表评论

关键词:C/C++, 图形/图像, MFC|来源:唯设编程网

使用VC进行图像处理的时候,CBitmap类为我们提供了丰富的位图处理函数,本文总结了该类的相关函数和常用使用方法,包括加载位图,显示位图,析构CBitmap资源以及在内存中保存位图等内容。

一. 基本概念

在MFC中,CBitmap类的声明如下:

class CBitmap : public CGdiObject
{
	DECLARE_DYNAMIC(CBitmap)

public:
	static CBitmap* PASCAL FromHandle(HBITMAP hBitmap);

// Constructors
	CBitmap();

	BOOL LoadBitmap(LPCTSTR lpszResourceName);
	BOOL LoadBitmap(UINT nIDResource);
	BOOL LoadOEMBitmap(UINT nIDBitmap); // for OBM_/OCR_/OIC_
#ifndef _AFX_NO_AFXCMN_SUPPORT
	BOOL LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0,
		LPCOLORMAP lpColorMap = NULL, int nMapSize = 0);
#endif
	BOOL CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitcount,
			const void* lpBits);
	BOOL CreateBitmapIndirect(LPBITMAP lpBitmap);
	BOOL CreateCompatibleBitmap(CDC* pDC, int nWidth, int nHeight);
	BOOL CreateDiscardableBitmap(CDC* pDC, int nWidth, int nHeight);

// Attributes
	operator HBITMAP() const;
	int GetBitmap(BITMAP* pBitMap);

// Operations
	DWORD SetBitmapBits(DWORD dwCount, const void* lpBits);
	DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const;
	CSize SetBitmapDimension(int nWidth, int nHeight);
	CSize GetBitmapDimension() const;

// Implementation
public:
	virtual ~CBitmap();
#ifdef _DEBUG
	virtual void Dump(CDumpContext& dc) const;
#endif
};

不难发现,CBitmap类继承自CGdiObject类,提供了用来加载位图的LoadBitmap函数和其它相关的位图处理函数。下面是CGdiObject类的声明:

class CGdiObject : public CObject
{
	DECLARE_DYNCREATE(CGdiObject)
public:

// Attributes
	HGDIOBJ m_hObject;                  // must be first data member
	operator HGDIOBJ() const;
	HGDIOBJ GetSafeHandle() const;

	static CGdiObject* PASCAL FromHandle(HGDIOBJ hObject);
	static void PASCAL DeleteTempMap();
	BOOL Attach(HGDIOBJ hObject);
	HGDIOBJ Detach();

// Constructors
	CGdiObject(); // must Create a derived class object
	BOOL DeleteObject();

// Operations
#pragma push_macro("GetObject")
#undef GetObject
	int _AFX_FUNCNAME(GetObject)(int nCount, LPVOID lpObject) const;
	int GetObject(int nCount, LPVOID lpObject) const;
#pragma pop_macro("GetObject")
	UINT GetObjectType() const;
	BOOL CreateStockObject(int nIndex);
	BOOL UnrealizeObject();
	BOOL operator==(const CGdiObject& obj) const;
	BOOL operator!=(const CGdiObject& obj) const;

// Implementation
public:
	virtual ~CGdiObject();
#ifdef _DEBUG
	virtual void Dump(CDumpContext& dc) const;
	virtual void AssertValid() const;
#endif
};

该类封装了一些更为基础和通用的方法。

二. 使用实例

下面给出一些CBitmap的使用实例。

1.  装载已导入工程的位图资源

	// 装载位图

	CBitmap bmp;
	bmp.LoadBitmap(IDB_BITMAP);

装载位图非常简单,直接调用CBitmap类的成员方法LoadBitmap即可,该方法可以实现位图资源文件的加载。

2.  装载位图文件

上一部分介绍了从资源文件中加载位图,但是在实际使用中,我们通常需要直接从磁盘文件加载位图文件。为了能让CBitmap能够装载位图文件,必须调用API函数LoadImage,下面是LoadImage函数的原型:

HANDLE LoadImage(  
  HINSTANCE hinst,   // handle of the instance containing the image  
  LPCTSTR lpszName,  // name or identifier of image  
  UINT uType,        // type of image  
  int cxDesired,     // desired width  
  int cyDesired,     // desired height  
  UINT fuLoad        // load flags  
);  

可以通过下面两种方法加载位图文件:

方案1:

HBITMAP hBmp = (HBITMAP)LoadImage(NULL,  
    m_fileName,  
    IMAGE_BITMAP,   
    0, 0,   
    LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);  
<12>
发表评论0条 】
网友评论(共?条评论)..
VC编程之图像处理类CBitmap的用法