CBitmap拷貝函數(根據一個CBitmap對象創建另一個相同的CBitmap對象)

1、有時需要使用一個與源CBitmap相同的CBitmap對象而不是一個源CBitmap對象的指針,例如不希望更改源CBitmap對象的情況下,就需要構造一個與源對象相同,但是與源對象無關的對象;通常情況下,會想到拷貝構造函數,但是CBitmap類比較特殊,不能使用該方法,那麼就只有自己來實現響應的構造操作了。總結了以下,大致有以下兩種方法:一是利用MFC封裝的繪圖設備,利用兩個CDC,將圖像拷貝過來;二是利用CreateBitmap直接構造。


2、實現一:

BOOL CopyCBitmapFromSrc(CBitmap* pBitmapDest, CBitmap* pBitmapSrc)
{
	BOOL bFlag = FALSE;

	CDC dcMemSrc;
	CDC dcMemDest;
	BITMAP bmpSrc;

	dcMemSrc.CreateCompatibleDC(NULL);
	dcMemSrc.SelectObject(pBitmapSrc);
	pBitmapSrc->GetBitmap(&bmpSrc);

	dcMemDest.CreateCompatibleDC(NULL);
	pBitmapDest->CreateCompatibleBitmap(&dcMemSrc, bmpSrc.bmWidth, bmpSrc.bmHeight);
	dcMemDest.SelectObject(pBitmapDest);

	bFlag = dcMemDest.BitBlt(0, 0, bmpSrc.bmWidthBytes, bmpSrc.bmHeight, &dcMemSrc, 0, 0, SRCCOPY);

	dcMemSrc.DeleteDC();
	dcMemDest.DeleteDC();
	return bFlag;
}



3、實現二:

BOOL CopyCBitmapFromSrc(CBitmap* pBitmapDest, CBitmap* pBitmapSrc)
{
	BOOL bFlag = FALSE;

	BITMAP bmpInfo;
	// 獲取源圖信息
	pBitmapSrc->GetBitmap(&bmpInfo);
	// 求取每一個像素所佔的字節
	long sizeBits = bmpInfo.bmWidth * bmpInfo.bmHeight * ( bmpInfo.bmWidthBytes / bmpInfo.bmWidth );
	// 分配內存
	PBYTE pBits = new BYTE[ sizeBits ];
	ZeroMemory(pBits, sizeBits);
	// 保存源圖像素信息
	pBitmapSrc->GetBitmapBits(sizeBits, pBits);
	// 創建新圖
	bFlag = pBitmapDest->CreateBitmap(bmpInfo.bmWidth, bmpInfo.bmHeight, bmpInfo.bmPlanes, bmpInfo.bmBitsPixel, pBits);
	// 回收資源
	delete []pBits;


	return bFlag;
}

調用示例:

CBitmap bmDest;
CopyCBitmapFromSrc(&bmDest, pBitmap);


4、實現三(來源於網絡):

接下來函數調用:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章