c++ - 如何从 Direct3D 11 Texture2D 对象中提取位图?

标签 c++ windows directx screenshot direct3d11

我正在使用桌面复制 API (C++) 并创建了一个输出复制对象,并进一步查询了 ID3D11Texture2D 对象的接口(interface)。

我曾尝试使用“D3DX11SaveTextureToFile”和“DirectX::SaveWICTextureToFile”,但出现错误。我需要从该纹理中提取位图或像素缓冲区,以便将其保存为图像。我尝试使用子资源和 ID3D11DeviceContext::Map 函数来提取像素缓冲区,但它似乎是空的。但是 context->Draw() 似乎有效。

我是否可以从 texture2D 对象中提取像素缓冲区/位图/图像?

谢谢!

更新:我使用 DirectXTex 中的 CaptureTexture 函数解决了这个问题。您可以从生成的 ScratchImage

创建一个 HBITMAP

最佳答案

对于那些从 DirectX::SaveWICTextureToFile 获取 E_NOINTERFACE 作为返回码的用户,您需要使用以下方法之一初始化 COM:

HRESULT hr = CoInitialize(nullptr); // Single threaded

HRESULT hr = CoInitializeEx(nullptr, COINITBASE_MULTITHREADED);  // For multithreaded programs

不要忘记在完成后调用 CoUninialize()。这是因为WIC使用COM,使用前必须先初始化。

关于c++ - 如何从 Direct3D 11 Texture2D 对象中提取位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35266134/

相关文章:

c++ - 在不将前缓冲区复制回系统内存的情况下计算 gpu 前缓冲区中像素的平均值

c++ - vector访问速度,哪种方法更快?

windows - 从 Qt Creator 运行 Git Bash

python - 调用 Python 3.x 命令的跨平台方式

.net - BackgroundWorker:一旦 DoWork() 事件处理程序完成,它就死了吗?

c++ - 参数没有正确传递

c++ - 引用对象内部的指针

c# - 在c#代码中调用C++ dll

c++ - 使用 getfile 跳过一行

c++ - boost odeint 包示例代码中出现错误 C2309