圖像與文字的合成
作者:kylin
下載本文示例工程
前幾天要做一段程序,把文字和位圖圖像合成并保存為位圖文件。但問了好久都沒人給一個(gè)滿意的答復(fù),只好在黑暗中摸索,費(fèi)了一番功夫,實(shí)現(xiàn)了圖像與文字的合成,并且可用鼠標(biāo)拖動(dòng)文字?,F(xiàn)在我把代碼貼出,希望能給需要的朋友以幫助。
一、關(guān)鍵函數(shù)
int SetDIBits(HDC hdc, // 兼容DC的句柄HBITMAP hbmp, // 兼容位圖的句柄UINT uStartScan, // 掃描起始行的編號(hào)UINT cScanLines, // 掃描的行的數(shù)目CONST VOID *lpvBits, // 位圖緩沖區(qū)的指針,要求已經(jīng)分配空間CONST BITMAPINFO *lpbmi, // 位圖信息UINT fuColorUse // 顏色格式);
int GetDIBits(HDC hdc, // 兼容DC的句柄HBITMAP hbmp, // 兼容位圖的句柄UINT uStartScan, // 掃描起始行的編號(hào)UINT cScanLines, // 掃描的行的數(shù)目LPVOID lpvBits, // 位圖緩沖區(qū)的指針,要求已經(jīng)分配空間LPBITMAPINFO lpbi, // 位圖信息UINT uUsage // 顏色格式);
CreateMemObject(CDC *pDC, BITMAPINFO *lpbmi, int* pnLineChar){if (NULL == m_pMemDC){m_pMemDC = new CDC();m_pMemDC->CreateCompatibleDC(pDC);}if (m_pMemBmp != NULL){m_pMemDC->SelectObject(m_pOldBmp);delete m_pMemBmp;m_pMemBmp = NULL;}m_pMemBmp = new CBitmap(); //根據(jù)圖片的大小創(chuàng)建一個(gè)兼容位圖m_pMemBmp->CreateCompatibleBitmap(pDC, m_lpBMPHdr->biWidth, m_lpBMPHdr->biHeight);m_pOldBmp = m_pMemDC->SelectObject(m_pMemBmp);m_pMemDC->FillSolidRect(0, 0, m_lpBMPHdr->biWidth, m_lpBMPHdr->biHeight, RGB(255, 255, 255));//把圖像的數(shù)據(jù)繪制到兼容位圖上SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject,0, m_lpBMPHdr->biHeight, (LPVOID)m_lpDIBits, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);}
SetBmpText(const CString &strText, BOOL bRepaint){//本函數(shù)在位圖上添加文本m_strBmpText = strText;SetDIBits(m_pMemDC->GetSafeHdc(), (HBITMAP)m_pMemBmp->m_hObject,0, m_lpBMPHdr->biHeight, (LPVOID)m_lpDIBits, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);if (m_strBmpText.GetLength() > 0){//制造透明和重影效果m_pMemDC->SetBkMode(TRANSPARENT);m_pMemDC->SetTextColor(RGB(0, 0, 0));m_pMemDC->TextOut(10, 10, m_strBmpText);m_pMemDC->SetTextColor(RGB(255, 255, 255));m_pMemDC->TextOut(11, 11, m_strBmpText);}if (bRepaint){Invalidate();}}
SetSaveBmpPath(LPCTSTR pszPath){//從兼容位圖中取出合成的數(shù)據(jù)BYTE *pTemp = new BYTE[m_dwImageSize];ZeroMemory(pTemp, m_dwImageSize);int nCount = GetDIBits(m_pMemDC->GetSafeHdc(),(HBITMAP)m_pMemBmp->m_hObject, 0, m_lpBMPHdr->biHeight,(LPVOID)pTemp, (BITMAPINFO*)m_lpBMPHdr, DIB_RGB_COLORS);}
聯(lián)系客服