一、关键函数

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

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

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);
}

三、图例


添加文字的效果图

四、结束语

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

本程序存在以下问题:

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

Visual C++ 图像与文字的合成相关推荐

  1. 文字语音输入计算机是信息技术吗,( )内容产业是指将图像、文字、影像、语音等内容,运用数字化高新技术手段和信息技术进行整合运用 - 普法考试题库问答...

    相关题目与解析 信源是指产生各种信息(如语音.文字.图像及数据等)的信息源.() 卫星通信方式是指卫星通信系统传输或分配语音.数据.图像.文字等信息时所采用的工作方式.() 语音技术包括识别和合成.识 ...

  2. Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类

    本文适合于对机器学习和数据挖掘有所了解,想深入研究深度学习的读者 1.对概率基本概率有所了解 2.具有微积分和线性代数的基本知识 3.有一定的编程基础(Python) Java软件研发工程师转行之深度 ...

  3. 有了这个算法,图像上文字擦除再也用不上PS了

    摘要:本文介绍几篇关于自然场景下文字擦除的论文工作. 图像文字擦除方法 给定一幅自然场景图像,只将图像中文字区域抹去而不改动其他区域像素值的方法称为文字擦除算法.该方法在隐私保护,身份信息篡改,数据增 ...

  4. php教程水印,PHP教程之ImageTTFText函数实现图像加文字水印的详细资料说明

    ImageTTFText函数实现PHP图像加文字水印功能 一个ImageTTFText函数包含了如下的参数 imagettftext (image,size,angle, x, y,color,fon ...

  5. ABBYY FineReader 12PDF选项卡之图像及文字设置

    2019独角兽企业重金招聘Python工程师标准>>> PDF是广泛使用的文档格式.在ABBYY Finereader中,PDF文档的显示不会因电脑不同而有差异,可加密保护,非常适合 ...

  6. Photoshop学习(四):为图像添加文字

    文章目录 工具 目的 步骤 资料 工具 文本工具 目的 为图像添加文字. 步骤 1.打开素材图片, 帆船.jpg: 2.文本工具 书写字体: 3.[窗口]|[样式],打开样式面板: 选择样式: 资料 ...

  7. 图像、文字、表格识别开发工具

    A.深圳市金鸣科技有限公司: 金鸣文表识别系统   https://it.jm189.cn/ B.翔云OCR云服务平台    http://www.netocr.com/ C.阿里表格识别:https ...

  8. CSS图像填充文字(镂空文字效果 / 文字镂空效果)

    先展示一下最终效果: 开始做 1. 搭建基本代码结构 <!DOCTYPE html> <html><head><meta charset="utf- ...

  9. 文本与图像环绕html,围绕图像环绕文字

    我在为客户端设计的Web应用程序上缠绕文本时遇到了一些麻烦.下面你可以看到我有麻烦:围绕图像环绕文字 所以我非常希望这个文本来包装它上面的文字之下,以统一的方式.不在图像下面.下面你可以看到我使用这个 ...

最新文章

  1. 本地缓存性能之王Caffeine
  2. VMware将世界领先的云访问安全代理合作伙伴纳入移动安全联盟
  3. Python中的itertools.product
  4. 利用jqueryRotare实现抽奖转盘
  5. 优雅的读懂支持向量机 SVM 算法
  6. <笔记>光纤(光波导)中的传输特性1
  7. 计算机程序设计通讯录,(定稿)通讯录c语言程序设计(喜欢就下吧)
  8. GitHub中文排行榜,帮助你发现高分优秀中文项目(二)-Java
  9. 汽车EMI/EMC测试标准ISO7637-2详解
  10. could not resolve xxx.jar
  11. 苹果将数据转存至中国服务器 或威胁国内信息安全
  12. Protel (DXP2004sp2) 许可协议认证过程
  13. 微信小说域名被封-366tool在线解答微信屏蔽小说网页停止访问的解决方案
  14. HTML简述及基本结构
  15. Linux版本Java卸载
  16. 隐私保护的数据挖掘综述
  17. 从战略管理角度看ERP系统信息缺失
  18. 数据库设计报告——用教材管理系统来举例
  19. 360手机助手 无法android 4.2手机软件移动sd卡,360手机助手怎么设置安装到sd卡 360手机助手设置安装位置...
  20. 华为pppoe拨号配置

热门文章

  1. 手持「前症保障」的百惠保,号称最容易理赔的重疾险?
  2. JAVA流浪猫狗救助平台
  3. 定时任务监控服务Healthchecks
  4. 开源监控Prometheus介绍,安装,配置,使用详解
  5. github搜索语法-信息搜集指南----总结
  6. 降噪效果好的蓝牙耳机该怎么选?盘点四款高品质降噪蓝牙耳机
  7. JS(JavaScript)中实现深浅拷贝的几种方式(详细阅读 非常重要)。
  8. 动态海报,一次 Computational Design 实验
  9. 平面设计必备学习软件
  10. 六所大学要增加计算机类硕士专业,三所大学将被撤销!2021年学位授权点审核名单公布...