MFC+Opengl:截取对话框的屏幕后,直接作为背景纹理解决方法

windows - 屏幕抓取技术总结 Windows抓屏技术 前3项是主要的使用monitor_capture也是obs中在使用的 文章目录1. BitBlt (DC)1.1 调用过程1.2 优缺点2.DXGI2.1 调用流程2.2 性能对比2.3 优缺点3. WGC(Windows Graphics Capture)4. Mirror driver(win8 之前适用)5、GDI hook( 适用较少)6. Windows Media API(依赖SDK 不常用)优缺点:7. PrintWindow8. DWM/Dxgi hook9. Get 阅读详情

摘自:http://www.verydemo.com/demo_c288_i41599.html

MFC+Opengl:截取对话框的屏幕后,直接作为背景纹理

我遇到的问题大体是用定时器每隔1秒控制进行对话框截屏,可以生成一个内存位图BITMAP,然后想提取这个BITMAP的信息,直接作为纹理。
具体如下:我首先截取一个对话框的窗口,然后放到DC中,然后根据该DC生成一个BITMAP,最后根据这个BITMAP来生成纹理。因为我不想将截取的屏幕保存成图片,因为在硬盘上生成图片和加载纹理,速度比较慢。所以,直接将截取的窗口,保存到BITMAP中,然后根据BITMAP,生成纹理。
代码如下:
C/C++ code
//截屏并产生纹理
void CDialogGLDlg::Screen(char *filename)
{
    int Width = 512;
    int Height = 512;

    //获取当前设备
    HWND hwnd = GetSafeHwnd();
    HDC hDC = ::GetDC(hwnd);
    CDC *pDC;//窗口DC
    pDC = CDC::FromHandle(hDC);

    CDC memDC;//内存DC
    memDC.CreateCompatibleDC(pDC);
    HDC memoryDC = CreateCompatibleDC(hDC);

    CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
    memBitmap.CreateCompatibleBitmap(pDC, Width, Height);
    oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC

    memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);

    BITMAP bmp;
    memBitmap.GetBitmap(&bmp);//获得位图信息

    //加载图片并获取其位图句柄
    //BITMAP bmp;
    //HBITMAP hBitmap=(HBITMAP)LoadImage( NULL , filename , IMAGE_BITMAP, 0 , 0 , LR_CREATEDIBSECTION | LR_LOADFROMFILE );
    //if(hBitmap == NULL)
    //{
    //    MessageBox("Failed");
    //}
    //GetObject(hBitmap,sizeof(BITMAP),&bmp);
    glGenTextures(1, &texture[0]); // 生成对象名,存放在texture[0]中
    glBindTexture(GL_TEXTURE_2D, texture[0]); //创建纹理对象
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); //双线性采样滤波方式
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0 , 3, bmp.bmWidth, bmp.bmHeight,
        0 ,GL_RGB , GL_UNSIGNED_BYTE, bmp.bmBits);


    //DeleteObject(hBitmap);
    memDC.DeleteDC();
    ReleaseDC(pDC);
    memBitmap.DeleteObject();
    oldmemBitmap->DeleteObject();

}

//纹理的绑定和设置
void CDialogGLDlg::RenderScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
   
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_QUADS);                           
        glTexCoord2f(0.0f,0.0f); glVertex3f(-30.0f,-30.0f,-50.0f);   
        glTexCoord2f(1.0f,0.0f); glVertex3f(30.0f,-30.0f,-50.0f);   
        glTexCoord2f(1.0f,1.0f); glVertex3f(30.0f,30.0f,-50.0f);   
        glTexCoord2f(0.0f,1.0f); glVertex3f(-30.0f,30.0f,-50.0f);
    glEnd();

    ::glCallList(1);
    glPopMatrix();
}


结果用这种方式加载的纹理是花的,看起来是密密麻麻的竖线,看不清本来面貌。感觉函数是没问题的,就怀疑是读取的位置的问题、或者是显存没有清空的问题。

MFC之OpenGL 纹理贴图后再绘制线条两个颜色相互影响 OpenGL渲染方式比GDI+强太多了,所以做绘图操作时我选择了OpenGL(新手),但是我在纹理贴图时出现了这样一个问题,就是我在贴完图后再继续在绘制线条什么的最后::SwapBuffers(hDC_); glFlush(); 也就是输出到显示器时纹理贴图的颜色竟然被线条的颜色影响了,如: 而如果我只是贴图而不绘制线条就是没有用到glColor3f()重新设置颜色的时候... 阅读详情

相关推荐

MFC之OpenGL 在自定义窗口使用纹理的方式渲染YUV422(UYVY)视频流数据

由于之前一直都是使用老版本的OpenGL(1.0版本的),所以只能是渲染RGB的纹理图像,这样对于视频流来说太耗CPU了,因为首先你要把YUV转成RGB,然后才能把RGB以纹理的形式渲染这样子效率很低;为了提高程序运行效率所以打算修改为直接渲染YUV的(相机传过来的)数据,这样子直接省略了YUV转RGB这一步,大大提高了程序运行效率 由于相机传过来的是UYVY格式...

Ilson_的博客 1711

OpenGl 编程指南笔记 第九章:纹理映射 (texture mapping)

<br />本章你将学到纹理映射基础知识 纹理坐标 纹理对象及绑定 纹理过滤 mipmap和自动生成mipmap 纹理参数, 外包模式, 细节级别 纹理环境和纹理函数 Table of Contents1 概述2 预备知识: 纹理坐标3 使用纹理映射3.1 纹理对象3.2 纹理绑定3.3 删除纹理对象3.4 驻留纹理3.5 纹理优先级4 指定纹理4.1 2D 纹理4.2 1D 纹理4.3 3D 纹理4.4 Cube Map 纹理5 纹理过滤6 简单例程1 概述<br />概括的说, 纹理映射机制允许你将一个

hitxiaya的专栏 4918

MFC下实现OpenGL纹理贴图

使用vs2010,基于MFC下的OpenGL,实现纹理贴图,键盘控制物体的运动,运行结果为一个魔方

23. 保存纹理(保存屏幕截图)

在图形应用程序中,读者也希望为显示在屏幕上的内容保存一幅屏幕截图。这非常有用。幸运的是,在Direct3D中创建和保存屏幕截图非常简单明了。为了实现该功能,需要获取当前已渲染好的场景宽度和高度,创建Direct3D表面,将渲染后的场景复制到创建好的表面对象中,然后调用一个Direct3D函数将表面保存到Direct3D支持的文件格式中。该文件格式可以是前面讨论过的任何标准文件类型,如.jpg、.t...

weixin_33785108的博客 656

opengl在MFC中实现纹理映射和平面海浪移动

在mfc单文档编程中编写OpenGL程序,实现了纹理映射。基本算是实现平面的海浪移动,适合初学者。本人就是初学者啦,三维起伏自己还在研究,希望可以跟大家多多交流。

OpenGL窗口背景绘制

基于MFC对话框实现OpenGL背景的绘制 博客地址: http://blog.youkuaiyun.com/xiaoge132/article/details/51448326

【OPENGL】纹理贴图出现颜色干扰的问题

glBindTexture(GL_TEXTURE_2D,texture[0]); 在这句前要用 glEnable(GL_TEXTURE_2D) 结束后 glDisable(GL_TEXTURE_2D) 记住,opengl是状态机,状态一开,不关闭前一直有效的。 glColor3f这句也一样 用纹理贴图前最后用glColor3f(1,1,1); 以免前用过颜色影响后面的。 ...

weixin_30757793的博客 853

基于MFC的OpenGL实现动态图

基于MFC的OpenGL实现动态图 vs2010下实现三维图形的旋转、平移、缩放 主要是在xxxView.cpp中的代码

OPENGL 贴图影响绘制 OR 绘图影响贴图

OPENGL中假如我要在一幅背景图上画图,有时候会出现颜色混在一起的情况。 解决方案 贴图之前:     glEnable(GL_TEXTURE_2D); 之后     glDisable(GL_TEXTURE_2D); 绘图后     glColor3f(1,1,1); 这样就互不影响了。

蓝色污点的专栏 1049

OpenGL实现纹理贴图,绘制两个棋盘

OpenGL红包书实例,完整代码,实现黑白棋盘绘制,一个正向,一个侧向棋盘

OpenGL+MFC三维绘图

基于OpenGL和MFC单文档的三维图像平台,实现图形的平移、旋转、缩放等功能,对初学者有很大的帮助。

OpenGL总结7-颜色与纹理共存

在使用OpenGL进行纹理贴图后,我需要在上面画一些线作为辅助,但是当我进行画线的时候发现glColor中的颜色会覆盖到纹理上,导致纹理的颜色很奇怪,经过查找资料和尝试发现了问题所在。 首先,纹理在不使用的时候一定要进行关闭,因为如果不将纹理进行关闭,后面在绘图的时候会影响到纹理。其次,要对颜色进行保存,也就是压栈glPushAttrib,这样对颜色进行保存后才能保证画线的颜色不会影响到其他图像。...

windxgz的博客 1343

YOLO26算法皮革表面缺陷检测+训练好的模型+124张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[颜色(color), 切(cut), 折叠(fold), 胶水(glue), 好的(good), 戳(poke)] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 68 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.7582** mAP50-95 | 0.4306 Precision | 0.6226 Recall | 0.6520 train/box_loss | 0.8731 train/cls_loss | 2.3543 val/box_loss | 1.3709 val/cls_loss | 3.9767 【训练过程分析】 从一开始的配置就定下了基调,训练配置包括了 yolo26n 模型、100 个 epoch,学习率初始设为 0.01,输入尺寸定为 640x640,批次大小为 24。这组配置在开始阶段表现得不错,模型刚开始训练时的 loss 降低得很快,这表明模型能够迅速从数据中吸收信息。但到了中后期,loss 曲线变得愈发平缓,从第 50 个 epoch 开始,即使我增加了学习率衰减的频率,仍然感到曲线在挣扎,像是陷入了平台期。这期间模型的收敛节奏明显减缓,似乎有些“停滞不前”的迹象。到了最后,模型确实收敛了,但在第 68 个 epoch 时 mAP50 获得了 0.7582 的值,这是一个不错的成绩,但与理想值相比仍有提升空间。... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

OpenGL中显示背景贴图

转载请声明出处: 导言: 通常在OpenGL里面绘制的都是默认的黑色背景,对于有些时候,太过于单调了,现在我们可以对它加上背景,实现一个不错的图形. 在网上看到人家要实现星空图,找到一张星空图片贴在背景上面. 看一下效果图 原理: 看一下下面的这张图: 这是OpenGL里面摄像机的原理图,我们要绘制的物体在离摄像机近的地方,那个离摄像机远的矩形

xiaoge132的专栏 2万+

视频编码压缩11111

视频编码压缩11111

Coze平台智能体开发实战:打造测试工程师的AI助手

智能体是具备特定身份和能力的AI实体,由大语言模型(LLM)驱动,并通过插件、知识库和工作流扩展其能力。明确的角色定位:可以设定特定身份和专业领域扩展能力:通过插件连接外部工具和服务记忆能力:通过知识库存储和检索专属信息流程化处理:通过工作流执行复杂多步任务通过Coze平台创建测试工程师智能体,可以显著提升测试效率和质量。明确的角色定位:聚焦测试工程师的实际需求丰富的知识库:提供准确的领域知识支持合适的工具集成:通过插件连接现有工具链持续迭代优化:根据反馈不断改进智能体行为自动化测试生成。

hogwarts_beibei的博客 1005

OpenGL绘制纹理,缩放相机导致纹理闪烁的解决方法gluPerspective ()

做项目的时候,对三维场景中的物体进行了纹理贴图。但是奇怪的是,缩放相机或者是左右移动视角,变换视图矩阵时,纹理贴图会出现大范围的闪烁现象。查了好久,最后发现问题出在投影视景体的参数设置上。我们的投影视景体用的方法是:gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); glPerspecti

u011450490的博客 5806

手把手教你用DLP4500投影仪玩转结构光3D扫描(附固件烧录与序列设置避坑指南)

本文详细解析了如何使用DLP4500投影仪搭建结构光3D扫描系统,涵盖硬件组装、固件烧录、图案生成与优化等全流程。重点解决了固件烧录失败、图像格式错误等常见问题,并提供了实用的避坑指南和进阶技巧,帮助读者快速掌握DLP4500在3D扫描中的应用。

weixin_42662293的博客 301
上一篇: VC++绘图时,利用双缓冲解决屏幕闪烁
下一篇: 多窗口使用OpenGL——wglShareLists使用简介
swping
博客等级 码龄20年 10粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值