图像与文字的合成

原创 2004年06月28日 14:56:00

图像与文字的合成

作者:kylin

下载本文示例工程

前几天要做一段程序,把文字和位图图像合成并保存为位图文件。但问了好久都没人给一个满意的答复,只好在黑暗中摸索,费了一番功夫,实现了图像与文字的合成,并且可用鼠标拖动文字。现在我把代码贴出,希望能给需要的朋友以帮助。

一、关键函数

1.
int SetDIBits( HDC hdc, // 兼容DC的句柄 HBITMAP hbmp, // 兼容位图的句柄 UINT uStartScan, // 扫描起始行的编号 UINT cScanLines, // 扫描的行的数目 CONST VOID *lpvBits, // 位图缓冲区的指针,要求已经分配空间 CONST BITMAPINFO *lpbmi, // 位图信息 UINT fuColorUse // 颜色格式 );

这个函数把位图数据一个像素一个像素的贴到一个兼容位图上,hdc是选择了兼容位图的兼容DC。

2.
int GetDIBits( HDC hdc, // 兼容DC的句柄 HBITMAP hbmp, // 兼容位图的句柄 UINT uStartScan, // 扫描起始行的编号 UINT cScanLines, // 扫描的行的数目 LPVOID lpvBits, // 位图缓冲区的指针,要求已经分配空间 LPBITMAPINFO lpbi, // 位图信息 UINT uUsage // 颜色格式 );

这个函数的作用和SetDIBits刚好相反,它把兼容位图内已存在的数据一个像素一个像素的拷贝到数据缓冲区(lpvBits)中。这样程序的实现就比较明朗了,首先根据位图的尺寸,创建一个兼容位图,然后把图片绘制到兼容位图,接着把文字也写到兼容位图上,然后再从兼容位图得到合成的数据。

二、关键程序段
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); }

三、图例

bmptext.gif
添加文字的效果图

四、结束语

有关位图的读写,参考了VC知识库在线杂志第21期中胡卓玮朋友写的《位图文件读写综述》一文。
本程序在win2000、vc6、174*218 24位真彩色图片下调试通过。

本程序存在以下问题:

1.不能在兼容DC里选择画笔、字体;
2.从兼容位图里取数据,仅对真彩色位图有效。

如果您知道如何解决以上问题,欢迎赐教。

地址:南京世纪新讯科技有限公司;msn:kylin_wei@hotmail.com

python图像融合(基于PIL Image模块)

本文主要是记录python中如何使用Image模块进行基本的图像R、G、B、A值得获取。 并将两张图片融合成一张...
  • qq_31133609
  • qq_31133609
  • 2016年06月08日 23:19
  • 1788

利用PIL合成图像为下一步做准备

看着大家都在勤奋的练习着自己喜欢的东西,再看看我的练习,汗颜。言归正传,这两天看着天涯他们参加T-Shirt大赛,很有意思,自己虽然不会做图,但也打算曲线做点贡献,做一个T-Shirt合成系统。第一步...
  • changzheng
  • changzheng
  • 2005年04月19日 17:12
  • 1689

python图像处理库PIL高清晰保存缩放图片

原文地址:http://saepy.sinaapp.com/topic/66/在sae-python上使用pil-image-获取较高质量图片的方法 最近在做小脚丫应用,在使用PIL i...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2016年01月08日 16:24
  • 5432

python中显示图片和文字

python中显示图片和文字的两种实现方法
  • sinat_29089097
  • sinat_29089097
  • 2017年11月21日 11:08
  • 279

【旧代码整理】一个处理图片的class,拼接图片,在图片上下加文字

function是网上找来改改的,然后做成了一个Class 字体文件是 微软雅黑 yahei.ttf  搜一搜可以下载到。 ...
  • joyatonce
  • joyatonce
  • 2016年07月15日 09:57
  • 682

【python图像处理】两幅图像的合成一幅图像(blending two images)

将两幅图像合成一幅图像,是图像处理中常用的一种操作,python图像处理库PIL中提供了多种种将两幅图像合成一幅图像的接口。...
  • guduruyu
  • guduruyu
  • 2017年05月09日 10:27
  • 3490

【python图像处理】gif动态图的解析与合成

gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图。这里,就介绍下如何使用python来解析和生成gif图像。...
  • guduruyu
  • guduruyu
  • 2017年08月24日 20:11
  • 3765

图像与文字的合成

图像与文字的合成作者:kylin下载本文示例工程前几天要做一段程序,把文字和位图图像合成并保存为位图文件。但问了好久都没人给一个满意的答复,只好在黑暗中摸索,费了一番功夫,实现了图像与文字的合成,并且...
  • ggfish
  • ggfish
  • 2008年07月08日 17:12
  • 293

Visual C++ 图像与文字的合成

一、关键函数int SetDIBits(        HDC hdc,                  // 兼容DC的句柄        HBITMAP hbmp,             //...
  • meiyuli
  • meiyuli
  • 2010年11月09日 21:49
  • 1080

Python图像处理库:PIL中Image,ImageDraw等基本模块介绍

常用操作 合成 Image.blend(i1,i2,a)/Image.composite(i1,i2,mask) 缩略图 thumbnail(size,filter=None)   ...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年03月15日 18:47
  • 7897
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图像与文字的合成
举报原因:
原因补充:

(最多只允许输入30个字)