首页 > 其他分享 >Qt中使用DXGI截取桌面图像

Qt中使用DXGI截取桌面图像

时间:2024-10-19 20:47:11浏览次数:9  
标签:Qt LEVEL TYPE 截取 DRIVER FEATURE D3D DXGI

文章目录

一、概要

DXGI(DirectX Graphics Infrastructure)图像截取是一种技术,用于从图形设备接口(Graphics Device Interface)中捕获屏幕上的图像数据。它是基于 DirectX 和 DXGI 接口的截取方法。

二、DXGI 图像截取的实现步骤

1. 获取 DXGI 设备和适配器: 首先,通过调用 CreateDXGIFactory 来创建一个 DXGI 工厂对象。然后使用工厂对象的 EnumAdapters 方法来获取系统上的适配器(显示适配器)。可以根据需求选择适配器。
2. 创建 DXGI 输出(Output)对象: 使用选定的适配器调用 EnumOutputs 方法来获取适配器上的输出(显示器)。可以选择某个输出,或者使用默认输出(通常是主显示器)。
3. 创建 DXGI 输出复制(Output Duplication)对象: 调用 IDXGIOutput1 接口的 DuplicateOutput 方法来创建一个 DXGI 输出复制对象。输出复制对象用于捕获屏幕上的图像数据。
4. 获取桌面帧: 使用输出复制对象的 AcquireNextFrame 方法来获取下一个桌面帧(Desktop Frame)。这个桌面帧包含了屏幕上的图像数据。
5. 访问桌面帧数据: 可以通过输出复制对象的 MapDesktopSurface 方法将桌面帧数据映射到内存中。然后可以使用指针来访问图像数据。
6. 释放桌面帧和输出复制对象: 使用 IDXGIOutputDuplication 接口的 ReleaseFrame 方法来释放桌面帧。最后调用 Release 方法释放输出复制对象。

三、DXGI常用接口介绍

1. D3D11CreateDevice

D3D11CreateDevice是 DirectX 11 中用于创建 D3D 设备的函数

HRESULT D3D11CreateDevice(
  IDXGIAdapter         *pAdapter,
  D3D_DRIVER_TYPE      DriverType,
  HMODULE              Software,
  UINT                 Flags,
  const D3D_FEATURE_LEVEL *pFeatureLevels,
  UINT                 FeatureLevels,
  UINT                 SDKVersion,
  ID3D11Device         **ppDevice,
  D3D_FEATURE_LEVEL    *pFeatureLevel,
  ID3D11DeviceContext  **ppImmediateContext
);
接口参数说明

pAdapter: 指向 DXGI 适配器(IDXGIAdapter)的指针,用于指定使用的图形适配器。可以为 nullptr,表示使用默认适配器。
DriverType: 指定驱动类型,如 D3D_DRIVER_TYPE_HARDWARE、D3D_DRIVER_TYPE_WARP 或 D3D_DRIVER_TYPE_REFERENCE。
Software: 指定一个可选的软件模块的句柄,用于软件驱动。一般情况下可以传入 nullptr。
Flags: 配置标志,用于配置设备创建的行为。可以是 D3D11_CREATE_DEVICE_FLAG 枚举值的组合,如D3D11_CREATE_DEVICE_DEBUG 用于启用调试模式。
pFeatureLevels: 指向 D3D 特性级别(D3D_FEATURE_LEVEL)数组的指针,指定所需的 D3D 特性级别。可以为 nullptr,表示使用默认的特性级别。
FeatureLevels: 数组 pFeatureLevels 中的特性级别个数。
SDKVersion: DirectX SDK 版本号。通常使用 D3D11_SDK_VERSION 宏。
ppDevice: 输出参数,返回创建的 D3D 设备对象的指针。
pFeatureLevel: 输出参数,返回实际创建的 D3D 设备的特性级别。
ppImmediateContext: 输出参数,返回与设备关联的即时渲染上下文(ID3D11DeviceContext)的指针。

D3D_DRIVER_TYPE常见类型

D3D_DRIVER_TYPE 枚举类型定义了在 Direct3D 中可用的驱动程序类型。下面是 D3D_DRIVER_TYPE 中所有枚举值的含义:

D3D_DRIVER_TYPE_HARDWARE: 表示使用硬件加速的图形驱动程序。它指示 Direct3D 使用可用的硬件加速功能来执行图形渲染操作。通常用于具有独立显卡的系统。
D3D_DRIVER_TYPE_WARP: 表示使用 WARP(Windows Advanced Rasterization Platform)软件渲染器进行图形渲染。WARP 是一种在不具备独立显卡的系统上进行软件渲染的选择。它可以提供基本的图形渲染功能,但性能相对较低。
D3D_DRIVER_TYPE_REFERENCE: 表示使用参考软件渲染器进行图形渲染。参考渲染器是一种纯软件实现的渲染器,不依赖于硬件加速,适用于调试和开发目的。它通常用于验证和测试渲染代码,但性能较低。
D3D_DRIVER_TYPE_NULL: 表示使用空驱动程序类型。它不执行任何图形渲染操作,主要用于模拟或测试环境中。
D3D_DRIVER_TYPE_SOFTWARE: 表示使用软件驱动程序进行图形渲染。这是一种在没有硬件加速的系统上进行软件渲染的选择。它通常性能较低,仅用于特殊情况。
以上是 D3D_DRIVER_TYPE 中的所有枚举值及其含义。根据具体的系统配置和需求,你可以选择适合的驱动类型来执行 Direct3D 图形渲染操作。通常情况下,硬件加速的图形驱动程序(D3D_DRIVER_TYPE_HARDWARE)是首选的,以获得最佳性能和图形质量。
D3D_FEATURE_LEVEL 枚举类型定义了在 Direct3D 中可用的功能级别(Feature Level)。它表示硬件或驱动程序所支持的图形功能和功能集合。

D3D11CreateDevice 函数的使用示例
bool ScreenCapture::InitD3D11Device()
{
   
    D3D_DRIVER_TYPE driverTypes[] = {
   
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    UINT numDriverTypes = std::extent<decltype(driverTypes)>::value;

    D3D_FEATURE_LEVEL featureLevels[] = {
   
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_1
    };
    UINT numFeatureLevels = std::extent<decltype(featureLevels)>::value;
    D3D_FEATURE_LEVEL featureLevel;

    for (UINT i = 0; i < numDriverTypes; ++i)
    {
   
        HRESULT hr = D3D11CreateDevice(nullptr, driverTypes[i], nullptr, 0, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &m_pDevice, &featureLevel, &m_pDeviceContext);
        if (SUCCEEDED(hr)) {
   
            break;
        }
    }

    if (m_pDevice == nullptr || m_pDeviceContext == nullptr) {
   
        qDebug() << __FILE__ << __FUNCTION__ << __LINE__ << "InitD3D11Device Failed";
        return false;
    }

    return true;

}

2.QueryInterface

<

标签:Qt,LEVEL,TYPE,截取,DRIVER,FEATURE,D3D,DXGI
From: https://blog.csdn.net/TechNomad/article/details/143062283

相关文章

  • VTK9.3.1在Windows10+VS2022+Qt 5.14.2环境下编译安装以及VTK应用于QT
    文章目录概要搭建编译环境编译源代码VisualStudio2022+Qt使用VTK概要本文主要介绍VTK9.3.1如何在Windows10上使用VS2022和QT进行编译安装。搭建编译环境先从VTK官网下载VTK9.3.1的源码,VTK下载地址我们可以按照官方推荐的编译方式进行编译,首先设置三个文件夹......
  • Qt 模态对话框属性
    exec()QDialogdlg(this);dlg.exec();setModal()QDialogdlg(this);dlg.setModal(true); //相当于dlg.setWindowModality(Qt::ApplicationModal);dlg.show();setWindowModality()QDialogdlg(this);dlg.setWindowModality(Qt::ApplicationModal);dlg.show();枚......
  • Qt(信号槽)
    1.概念之前的程序界面只能看,不能交互,信号槽可以让界面进行人机交互。信号槽是Qt在C++基础上新增的特性,类似于其他编程中的回调机制,其目的是实现对象之间的通信。使用信号槽需要具备两个先决条件:通信的对象必须继承自QObjectQObject是Qt所有对象的基类,内部规定了Qt最基......
  • QT/c++相关记录
     QT的大部分容器类(如QString、QVector等)都是使用隐式共享(implicitsharing)技术,这是通过写时复制(copy-on-write,COW)实现的优化模式。理解这一点的关键在于,Qt的容器类需要在对象拷贝时高效处理数据,而隐式共享则允许在栈上操作容器的同时,在需要时共享内部数据的堆上存储。......
  • Learn OpenGL In Qt之纹理
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~公众号:C++学习与探索 | 个人主页:rainInSunny | 个人专栏:LearnOpenGLInQt文章目录纹理纹理坐标纹理环绕方式纹理采样多级渐远纹理纹理加载和创建加载纹理创建纹理应用纹理纹理纹理坐标  在前面的......
  • mqtt与云服务器
    mqtt目录mqtt回顾云服务器的操作MQTT协议--将官方库移植到工程--应用--可能会出现的问题:完整代码回顾--昨天我们写的AT指令是直接写在main中,在while循环的外面,没有很好的封装,所以今天我们写一个函数来封装AT指令 //要保证能在while循环中运行uint8_tstate......
  • 【QT】常用控件(二)
    个人主页~常用控件(一)~常用控件三、按钮类控件1、PushButtonwidget.hwidget.cpp2、RadioButton3、CheckBox四、显示类控件1、label三、按钮类控件1、PushButtonQPushButton继承自QAbstractButton,它是所有按钮的父类我们从这个按钮的属性表中可以看到,QPus......
  • canopen 导致qt上位机崩溃的原因分析
    今天开发过程中,在qt中移植canfestival协议栈后,上位机崩溃了,经过我的排查,发现了崩溃的原因。在协议栈中的代码如下UNS32RegisterSetODentryCallBack(CO_Data*d,UNS16wIndex,UNS8bSubindex,ODCallback_tCallback){UNS32errorCode;constindextable*odentry;o......
  • QT实现滑动页面切换
    1.界面实现效果以下是具体的项目需要用到的效果展示。2.简介原理:使用Qt的QPropertyAnimation动画类,这里简单来说就是切换两个界面。这个widget里面可以放很多个待切换的界面,每次切换的时候将当前界面和切换后的界面显示,其他界面都隐藏,然后当前界面移动到主界面之外,下一......
  • 2-STM32F103+ML307(中移4G Cat1)OTA升级篇(自建物联网平台)-STM32通过ML307使用http或
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明前面......