图像与文字的合成
作者:kylin
下载本文示例工程
前几天要做一段程序,把文字和位图图像合成并保存为位图文件。但问了好久都没人给一个满意的答复,只好在黑暗中摸索,费了一番功夫,实现了图像与文字的合成,并且可用鼠标拖动文字。现在我把代码贴出,希望能给需要的朋友以帮助。
一、关键函数
int SetDIBits( HDC hdc, // 兼容DC的句柄 HBITMAP hbmp, // 兼容位图的句柄 UINT uStartScan, // 扫描起始行的编号 UINT cScanLines, // 扫描的行的数目 CONST VOID *lpvBits, // 位图缓冲区的指针,要求已经分配空间 CONST BITMAPINFO *lpbmi, // 位图信息 UINT fuColorUse // 颜色格式 );
int GetDIBits( HDC hdc, // 兼容DC的句柄 HBITMAP hbmp, // 兼容位图的句柄 UINT uStartScan, // 扫描起始行的编号 UINT cScanLines, // 扫描的行的数目 LPVOID lpvBits, // 位图缓冲区的指针,要求已经分配空间 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(); //根据图片的大小创建一个兼容位图 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)); //把图像的数据绘制到兼容位图上 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) { //本函数在位图上添加文本 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) { //从兼容位图中取出合成的数据 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); }