最近在做项目时,需要实现在摄像机显示的图像上绘制指定的图案。就这样一个简单的功能花了三四天才彻底做出来,大部分时间都浪费在解决图像闪烁问题。于是整理了一下大概实现代码,用于记录成长过程和分享。

大概实现代码如下:

// 获取与窗口相关的HDC
HDC hdc = GetWindowDC(((HWND)m_hwnd));/*如果直接在hdc上进行绘画时,很大概率上会发生视频录像中图像闪烁的问题。一开始我就是直接在此句柄上进行绘制,导致显示出来的数据一直在闪烁。*/// 创建内存DC(创建一个与窗口矩形显示兼容的内存显示设备描述表)
HDC hMemDC = CreateCompatibleDC(hdc);HDRAWDIB hdib =::DrawDibOpen();
// 用完记得最后调用 ::DrawDibClose(hdib);关闭// 在hMemDC上画出需要的画面显示数据
int nRet=::DrawDibDraw(hdib,hMemDC,rc.left,rc.top,rc.right,rc.bottom,&(m_bmpInfo.bmiHeader),m_drawbuf,0,0,fixed_width,fixed_height,0);// 这里的m_hwnd 窗口句柄,由上层传递
RECT rc;
GetClientRect(m_hwnd, &rc);
int nWidth = rc.right - rc.left;
int nHeight = rc.bottom - rc.top;// 创建兼容性位图(用hdc创建一个与窗口矩形显示兼容的位图)
HBITMAP hMemBitmap = CreateCompatibleBitmap(hdc, nWidth , nHeight );// 将位图hBitmap选入到内存显示设备的hMenDC中,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
SelectObject(hMemDC, hMemBitmap);// 进行绘图操作
// 设置输出方式(TRANSPARENT:使用透明的输出)
SetBkMode((hMemDC , TRANSPARENT);// 计算字体高度与磅值
LOGFONT lFont;
memset(&lFont, 0, sizeof(LOGFONT));
// 设为16号字体
lFont.lfHeight = -MulDiv(16, GetDeviceCaps(hMemDC , LOGPIXELSY), 80);
lFont.lfWeight = FW_BOLD;// 创建字体
HFONT hFont;
hFont = ::CreateFontIndirect(&lFont);
//选择字体
HGDIOBJ hOldFont = ::SelectObject(hMemDC , hFont);
// 设置颜色    这里设置为(0,0,0)黑色,其他颜色可自己指定
SetTextColor((hMemDC , RGB(0, 0, 0));// 设置摄像机视频指定字符输出
std::string strText = “用于测试显示字符,图像是否闪烁”;
int nLen = (int)strText.size();
std::wstring wstr;
wstr.resize(nLen, L' ');
// CP_UTF8 utf_8显示
MultiByteToWideChar(CP_UTF8, 0, (LPCCH)strText.c_str(), nLen, (LPWSTR)wstr.c_str(), nLen);// 确定文字绘制区域
RECT rcDraw = { 0 };
rcDraw.left = 0;       // 具体位置按自己实际需求进行填写
rcDraw.top = 0;
rcDraw.right = 200;
rcDraw.bottom = 150;
// 画指定数据 DT_LEFT左上角  DT_WORDBREAK超过指定宽度自动换行
DrawText(hMemDC, (LPCWSTR)wstr.c_str(), (int)strText.size(), &rcDraw, DT_LEFT | DT_WORDBREAK);/// 最重要的一步
// 再将hMemDC画好的图案贴回到hdc上
BitBlt(hdc, rc.left, rc.top, rc.right, rc.bottom, hMemDC, 0, 0, SRCCOPY);// 清空
::SelectObject(hMemDC, hOldFont);
::DeleteObject(hFont);
hFont = NULL;
hOldFont = NULL;// 图已经画出来了.删除位图
::DeleteObject(hMemBitmap);
// 删掉内存hMemDC
DeleteDC(hMemDC);::ReleaseDC(m_hwnd, hdc);

不同环境实现时的代码一般都有差别,以上代码仅供参考。

参考资料的链接
获取HDC方法
实现双缓存
BitBlt()双缓冲解决图象闪烁
BitBlt参数含义

C++知识之如何利用双缓冲避免在HDC上画图时图像闪烁相关推荐

  1. VC++绘图时,利用双缓冲解决屏幕闪烁 转载

    最近做中国象棋,绘制界面时遇到些问题,绘图过程中屏幕闪烁,估计都会想到利用双缓冲来解决问题,但查了下网上双缓冲的资料,发现基本是MFC的,转化为VC++后,大概代码如下: void DrawBmp(H ...

  2. STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)

    前言 大概半个月之前捣鼓了下利用STM32实现实时曲线显示,中间又做了一点小改进和扩充,在这里更新一下: 利用DMA进行缓冲区到LCD GRAM的像素数据搬运 效果更好的曲线绘制策略 代码可以在这里找 ...

  3. 双缓冲(Double Buffer)原理和使用【转】

    转自:http://blog.csdn.net/acs713/article/details/16359551 原文出自:http://blog.csdn.net/xiaohui_hubei/arti ...

  4. 双缓冲(double buffering)的原理和使用

    最近在使用C#做项目的时候发现在加载一个具有大量控件和复杂背景图形的窗口时,会出现很影响视觉体验的频闪问题.最后发现使用双缓冲能很好的解决这个问题.下面就介绍一下双缓冲的原理及使用. 一.双缓冲作用 ...

  5. MFC基础知识(四)——双缓冲解决刷屏时闪烁

    本文主要介绍:在利用MFC画图或图像显示时,有时候需要调用OnDraw()函数刷新屏幕,而屏幕往往会发生闪烁,本文主要介绍利用双缓冲解决闪屏问题. 关于闪屏方面的介绍分析见博文: http://blo ...

  6. VC双缓冲画图技术介绍

    双缓冲画图,它是一种主要的图形图像画图技术.首先,它在内存中创建一个与屏幕画图区域一致的对象,然后将图形绘制到内存中的这个对象上,最后把这个对象上的图形数据一次性地拷贝并显示到屏幕上. 这样的技术能够 ...

  7. java双缓冲绘图_Java双缓冲技术-绘图应用

    1屏幕产生闪烁的原因 由于在显示所绘制的图像时,调用了repaint方法.repaint方法被调用时,需要清除整个背景,然后才调用paint方法显示画面.这样,在清除背景和绘制图像的短暂时间间隔内被用 ...

  8. java图片双缓存_Java 双缓冲技术消除图片闪动

    一般在使用Canvas组件刷新显示图片或者绘图的时候,会产生闪烁.这是由于机制是先使用背景色对原有内容进行覆盖,再往上面绘制新内容所引起的.我们看到的闪烁就是背景色和新内容之间的交替显示. 下面为Ca ...

  9. Linux framebuffer双缓冲防止闪烁

    昨天写了一篇文章: 使用Linux Framebuffer绘制32位真彩图形: https://blog.csdn.net/dog250/article/details/90113737 并发了朋友圈 ...

  10. 【学习总结】MFC(CImagelist)(重绘)(双缓冲)

    双缓冲实现按钮列表 本文通过介绍双缓冲与CImageList,重写CButton类,来实现按钮列表. 简单的效果图 双缓冲实现 双缓冲的技术原理: 在Windows中每一种设备都在内存中有一个设备描述 ...

最新文章

  1. .Net QQ互联教程
  2. fegin通信中速度慢等待解决异常
  3. 最长重复子串(Rabin-Karp算法)
  4. 错误 error C2220: 警告被视为错误 - 没有生成“object”文件
  5. 谈谈对集合框架的理解?
  6. 并发控制中存在问题及解决方案
  7. 基础物理-机械振动与波
  8. 微支付开发(.net)
  9. 控制/ 状态寄存器(RCC_CSR) 复位
  10. 什么是失血模型和充血模型?(DDD)
  11. Ubuntu 20.04.3 “have unmet dependencies“
  12. linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...
  13. Centos7中语言如何设置成中文
  14. unity3d培训_007
  15. 【附源码】计算机毕业设计SSM校园二手物品交易网站
  16. 组装3000元的办公台式电脑全过程
  17. 3D动画旋转rotateY的用法(23)
  18. 瑞博奥IPO过会:年营收2.85亿 黄若磐家族均为美国籍
  19. MySQL主从同步各类型故障总结
  20. 自从学会了Pandas,我用Python处理Excel更高效了

热门文章

  1. Cobalt Strike beacon详解
  2. 分布式操作系统 - 4.分布式通信管理
  3. 帆软FineBI试用
  4. 想不想修真鸿蒙源液哪里买,想不想修真悟道茶在哪买
  5. 我的 2020 总结:Never Settle
  6. 小巧时尚的机械键盘,通吃五台设备,雷柏MT510PRO键盘体验
  7. java对象转excel_Java中excel与对象的互相转换的通用工具类编写与使用(基于apache-poi-ooxml)...
  8. 如何练成大力金刚指:IKBC - C104 白色黑轴机械键盘 体验测评
  9. Python Playwright 打包报错 Please run the following command to download new browsers
  10. 蜂鸣器干扰通讯_提高蜂鸣器响度和降低蜂鸣器及驱动电路干扰电源的电路的制作方法...