【C/C++】使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小

这篇具有很好参考价值的文章主要介绍了【C/C++】使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,函数清单

1.Direct3DCreate9 函数

2.IDirect3D9::CreateDevice 方法

3.IDirect3DDevice9::GetDisplayMode 方法

4.IDirect3DDevice9::CreateOffscreenPlainSurface 方法

5.IDirect3DDevice9::GetFrontBufferData 方法

6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法

7. D3DXSaveSurfaceToFile 函数

二,关键代码实现

三,最终实现和展示效果

1.d3d下载和工程属性页配置d3d

2.全部实现代码

3.最终展示效果


一,函数清单

1.Direct3DCreate9 函数

Direct3DCreate9 函数创建 IDirect3D9 对象并返回一个接口。

IDirect3D9 * Direct3DCreate9(
  UINT SDKVersion
);
  • 参数:SDKVersion
  • 返回值:如果成功,此函数将返回指向 IDirect3D9 接口的指针;否则,返回 NULL 指针。

2.IDirect3D9::CreateDevice 方法

创建一个设备来表示显示适配器。

HRESULT CreateDevice(
  [in]          UINT                  Adapter,
  [in]          D3DDEVTYPE            DeviceType,
  [in]          HWND                  hFocusWindow,
  [in]          DWORD                 BehaviorFlags,
  [in, out]     D3DPRESENT_PARAMETERS *pPresentationParameters,
  [out, retval] IDirect3DDevice9      **ppReturnedDeviceInterface
);
  • 参数:点击函数名称跳转即可查看详细介绍
  • 返回值:如果该方法成功,则返回值为 D3D_OK。如果该方法失败,则返回值可以是以下之一:D3DERR_DEVICELOST、D3DERR_INVALIDCALL、D3DERR_NOTAVAILABLE、D3DERR_OUTOFVIDEOMEMORY。

3.IDirect3DDevice9::GetDisplayMode 方法

检索显示模式的空间分辨率、颜色分辨率和刷新频率。

HRESULT GetDisplayMode(
  [in]  UINT           iSwapChain,
  [out] D3DDISPLAYMODE *pMode
);
  • 参数:点击函数名称跳转即可查看详细介绍
  • 返回值:如果方法成功,则返回值D3D_OK。 如果方法失败,则可以D3DERR_INVALIDCALL返回值。

4.IDirect3DDevice9::CreateOffscreenPlainSurface 方法

创建屏幕外图面。

HRESULT CreateOffscreenPlainSurface(
  [in]          UINT              Width,
  [in]          UINT              Height,
  [in]          D3DFORMAT         Format,
  [in]          D3DPOOL           Pool,
  [out, retval] IDirect3DSurface9 **ppSurface,
  [in]          HANDLE            *pSharedHandle
);
  • 参数:点击函数名称跳转即可查看详细介绍
  • 返回值:如果方法成功,则返回值D3D_OK。 如果方法失败,则返回值可以是以下值:D3DERR_INVALIDCALL。

5.IDirect3DDevice9::GetFrontBufferData 方法

生成设备的前缓冲区的副本,并将该副本放置在应用程序提供的系统内存缓冲区中。

HRESULT GetFrontBufferData(
  [in] UINT              iSwapChain,
  [in] IDirect3DSurface9 *pDestSurface
);
  • 参数:点击函数名称跳转即可查看详细介绍
  • 返回值:如果方法成功,则返回值D3D_OK。 如果方法失败,则返回值可以是下列值之一:D3DERR_DRIVERINTERNALERROR、D3DERR_DEVICELOST、D3DERR_INVALIDCALL。

6.IDirect3DDevice9::D3DXLoadSurfaceFromSurface 方法

通过颜色转换从另一个图面加载图面。

HRESULT D3DXLoadSurfaceFromSurface(
  _In_       LPDIRECT3DSURFACE9 pDestSurface,
  _In_ const PALETTEENTRY       *pDestPalette,
  _In_ const RECT               *pDestRect,
  _In_       LPDIRECT3DSURFACE9 pSrcSurface,
  _In_ const PALETTEENTRY       *pSrcPalette,
  _In_ const RECT               *pSrcRect,
  _In_       DWORD              Filter,
  _In_       D3DCOLOR           ColorKey
);
  • 参数:点击函数名称跳转即可查看详细介绍
  • 返回值:如果函数成功,则返回值D3D_OK。 如果函数失败,则返回值可以是以下值之一:D3DERR_INVALIDCALL、D3DXERR_INVALIDDATA。

7. D3DXSaveSurfaceToFile 函数

将图面保存到文件。

HRESULT D3DXSaveSurfaceToFile(
  _In_       LPCTSTR              pDestFile,
  _In_       D3DXIMAGE_FILEFORMAT DestFormat,
  _In_       LPDIRECT3DSURFACE9   pSrcSurface,
  _In_ const PALETTEENTRY         *pSrcPalette,
  _In_ const RECT                 *pSrcRect
);
  • 参数:点击函数名称跳转即可查看详细介绍
  • 返回值:如果函数成功,则返回值D3D_OK。 如果函数失败,则返回值可能如下所示:D3DERR_INVALIDCALL。

二,关键代码实现

1.创建 IDirect3D9 对象

LPDIRECT3D9 pD3D = nullptr;     //Direct3D 对象是图形应用程序需要创建的第一个 Direct3D COM 对象,也是应用程序需要释放的最后一个对象
if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{//创建 IDirect3D9 对象并返回一个接口。
    return E_FAIL;
}

2.初始化用于创建 Direct3D 设备的 D3DPRESENT_PARAMETERS 结构的值。

LPDIRECT3DDEVICE9 pDevice = nullptr;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;      //如果应用程序运行窗口,则为 TRUE;如果应用程序全屏运行,则为 FALSE。
d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;  //运行时将保证有关缓冲区交换行为的隐式语义;

3.接下来,创建 Direct3D 设备

if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
{//创建一个设备来表示显示适配器。指定默认适配器、硬件抽象层 (HAL) 设备和软件顶点处理。
        return E_FAIL;
}

4.获取屏幕截图接口实现

IDirect3DSurface9* GetScreenShot(IDirect3DDevice9* pDevice) {
    IDirect3DSurface9* pSurface = nullptr;
    D3DDISPLAYMODE displayMode;
    //检索显示模式的空间分辨率、颜色分辨率和刷新频率。
    pDevice->GetDisplayMode(0, &displayMode);
    std::cout << displayMode.Width << displayMode.Height << std::endl;
    //创建屏幕外图面。
    HRESULT hr = pDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
    if (FAILED(hr)) {
        return nullptr;
    }
    //生成设备的前缓冲区的副本,并将该副本放置在应用程序提供的系统内存缓冲区中。
    hr = pDevice->GetFrontBufferData(0, pSurface);
    if (FAILED(hr)) {
        return nullptr;
    }
    return pSurface;
}

5.缩放图片接口实现

IDirect3DSurface9* ResizeSurface(IDirect3DDevice9* pDevice, IDirect3DSurface9* pSrcSurface, int width, int height) {
    IDirect3DSurface9* pDestSurface = nullptr;
    //创建屏幕外图面。
    HRESULT hr = pDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pDestSurface, NULL);
    if (FAILED(hr)) {
        return nullptr;
    }

    //通过颜色转换从另一个图面加载图面。
    D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);

    return pDestSurface;
}

三,最终实现和展示效果

1.d3d下载和工程属性页配置d3d

1.点击 Direct3D链接 下载,然后点击 exe 进行安装,安装好后内容如下:

截屏源码支持3d c++,C/C++,c++,开发语言

2.工程配置d3d的依赖:在VC++目录中配置 d3d 的包含目录和库目录(注意:库目录的位数要和解决方案平台的位数一致)

截屏源码支持3d c++,C/C++,c++,开发语言

2.全部实现代码

#include <iostream>
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

// 获取屏幕截图
IDirect3DSurface9* GetScreenShot(IDirect3DDevice9* pDevice) {
    IDirect3DSurface9* pSurface = nullptr;
    D3DDISPLAYMODE displayMode;
    //检索显示模式的空间分辨率、颜色分辨率和刷新频率。
    pDevice->GetDisplayMode(0, &displayMode);
    std::cout << displayMode.Width << displayMode.Height << std::endl;
    //创建屏幕外图面。
    HRESULT hr = pDevice->CreateOffscreenPlainSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
    if (FAILED(hr)) {
        return nullptr;
    }
    //生成设备的前缓冲区的副本,并将该副本放置在应用程序提供的系统内存缓冲区中。
    hr = pDevice->GetFrontBufferData(0, pSurface);
    if (FAILED(hr)) {
        return nullptr;
    }
    return pSurface;
}

// 缩放图片
IDirect3DSurface9* ResizeSurface(IDirect3DDevice9* pDevice, IDirect3DSurface9* pSrcSurface, int width, int height) {
    IDirect3DSurface9* pDestSurface = nullptr;
    //创建屏幕外图面。
    HRESULT hr = pDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pDestSurface, NULL);
    if (FAILED(hr)) {
        return nullptr;
    }

    //通过颜色转换从另一个图面加载图面。
    D3DXLoadSurfaceFromSurface(pDestSurface, NULL, NULL, pSrcSurface, NULL, NULL, D3DX_FILTER_TRIANGLE, 0);

    return pDestSurface;
}

int main() {
    // 1.初始化 Direct3D 设备
    LPDIRECT3D9 pD3D = nullptr;     //Direct3D 对象是图形应用程序需要创建的第一个 Direct3D COM 对象,也是应用程序需要释放的最后一个对象
    if (nullptr == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    {//创建 IDirect3D9 对象并返回一个接口。
        return E_FAIL;
    }
    // 2.创建 Direct3D 设备
    LPDIRECT3DDEVICE9 pDevice = nullptr;
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;      //如果应用程序运行窗口,则为 TRUE;如果应用程序全屏运行,则为 FALSE。
    d3dpp.SwapEffect = D3DSWAPEFFECT_COPY;  //运行时将保证有关缓冲区交换行为的隐式语义;
    if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(),
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
    {//创建一个设备来表示显示适配器。指定默认适配器、硬件抽象层 (HAL) 设备和软件顶点处理。
        return E_FAIL;
    }

    // 3.获取屏幕截图
    IDirect3DSurface9* pSrcSurface = GetScreenShot(pDevice);

    // 4.缩放图片(可用可不用)
    int targetWidth = 1920; // 目标宽度
    int targetHeight = 1080; // 目标高度
    IDirect3DSurface9* pDestSurface = ResizeSurface(pDevice, pSrcSurface, targetWidth, targetHeight);

    // 5.保存图片(保存到工程所在的目录下)
    D3DXSaveSurfaceToFile(L"screenshot.jpg", D3DXIFF_JPG, pDestSurface, NULL, NULL);

    // 6.释放资源
    pDestSurface->Release();
    pSrcSurface->Release();
    pDevice->Release();
    pD3D->Release();

    return 0;
}

3.最终展示效果

打开工程所在的目录,然后会看到有一张图片,图片效果如下,没有看错!就是一张图片!(温馨提示:该图片是通过代码截的,不是我自己截的哦)

截屏源码支持3d c++,C/C++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-801343.html

到了这里,关于【C/C++】使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Direct3D绘制旋转立方体例程

    Direct3D绘制旋转立方体例程

    初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp 运行结果

    2024年02月09日
    浏览(8)
  • Direct3D 12——模板——平面镜效果

    Direct3D 12——模板——平面镜效果

    1.将实物照常渲染到后台缓冲区内(不包括镜子)。注意,此步骤不修改模 板缓冲区。 2.清理模板缓冲区,将其整体置零。 将实物都绘制到后台缓冲区中,并将模板缓冲区清理为0 (用浅灰色来表示)。 绘制在模板缓冲区中的黑色轮廊线条反映的是:后台缓冲区与模板缓冲区

    2023年04月21日
    浏览(7)
  • Direct3D 12——灯光——光照模型的概述

    Direct3D 12——灯光——光照模型的概述

    将之前所述的所有光照内容都结合起来,即表面反射的光量相当于环境反射光、漫反射光以及 镜面反射光的光量总和。 1.环境光 C a :模拟经表面反射的间接光量。 2.漫反射光 C d :对进入介质内部,又经过表面下吸收而最终散射岀表面的光进行模拟。由于对表 面下的散射光

    2023年04月16日
    浏览(7)
  • Direct3D 12——计算着色器——计算着色器概念

    Direct3D 12——计算着色器——计算着色器概念

    计算着色器虽然是一种可编程的着色器,但Direct3D并没有将它直接归为渲染流水线中的一部分。虽然如此,但位于流水线之外的计算着色器却可以读写GPU资源。从本质上来说,计算着 色器能够使我们访问GPU来实现数据并行算法,而不必渲染出任何图形。由于计算着色器是Dir

    2024年02月03日
    浏览(9)
  • Character Animation With Direct3D 读书笔记

    2D动画:循环播放多张图片 3D动画: 骨骼动画、变形动画 Win32 应用程序 Application类:处理主程序循环,图形设备的初始化 Init:加载资源并创建图形设备 Update:更新游戏世界,移动对象,更新物理引擎 Render:渲染所有对象,并将结果呈现给屏幕 Quit Cleanup DirectX 渲染循环:

    2024年02月12日
    浏览(10)
  • 三维引擎基础概述(Direct3D、OpenGL、UE、U3D、threejs等)

    三维引擎基础概述(Direct3D、OpenGL、UE、U3D、threejs等)

    一般而言,三维引擎是在三维底层图形技术的基础上,封装硬件操作与三维图形算法,形成普遍意义上的三维交互引擎,提供给开发者一个简单易用、功能丰富的三维图形环境,在此基础上进行虚拟现实、三维交互、可视化管理平台二次开发等,极大提高开发效率。 【底层图

    2024年02月11日
    浏览(16)
  • web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

    web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

    三维引擎是指用于创建和渲染三维图形的软件框架。它们通常提供了图形处理、物理模拟、光照、碰撞检测等功能,帮助开发者构建逼真的三维场景和交互体验。在这里,我将为您详细介绍一些常见的三维引擎,包括Direct3D、OpenGL、Unreal Engine、Unity3D和Three.js。 Direct3D是由微软

    2024年02月11日
    浏览(8)
  • DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    DirectX12_Windows_GameDevelop_3:Direct3D的初始化

    查看龙书时发现, 第四章介绍预备知识的代码不太利于学习 。因为它不像是LearnOpenGL那样从头开始一步一步教你敲代码,导致你没有一种整体感。 如果你把它当作某一块的代码进行学习,你跟着敲会发现,总有几个变量是没有定义的。这是因为书上的代码都是把框架里的某

    2024年02月08日
    浏览(11)
  • 在direct3D中,透明度处理和D2D1_ALPHA_MODE_PREMULTIPLIED含义?

    D2D1_ALPHA_MODE_PREMULTIPLIED 是 Direct2D 中定义的一种 Alpha 模式,用于描述像素颜色值和其 Alpha 通道(透明度)之间的关系。 在非预乘 Alpha (Straight or Unpremultiplied Alpha) 图像中,每个颜色分量(红、绿、蓝)是独立于 Alpha 值的。而在预乘 Alpha 图像中,每个颜色分量已经被其对应的

    2024年01月25日
    浏览(9)
  • 缺失d3d9.dll怎么办,修复d3d9.dll的方法分享

    缺失d3d9.dll怎么办,修复d3d9.dll的方法分享

    当您在 Windows 操作系统中启动某些游戏或应用程序时,您可能会遇到“缺失d3d9.dll”的错误提示。这个问题通常是由于系统缺失了DirectX 9的组件库,从而导致该dll文件无法正常加载。但是,您不需要担心,因为这个问题可以很容易地解决。本文将介绍一些最常见的解决方案,

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包