【问题标题】:How to extract bitmap out of Direct3D 11 Texture2D object?如何从 Direct3D 11 Texture2D 对象中提取位图?
【发布时间】:2019-03-22 08:47:33
【问题描述】:

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

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

无论如何我可以从 texture2D 对象中提取像素缓冲区/位图/图像吗?

谢谢!

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

【问题讨论】:

  • 您遇到的 HRESULT 错误是什么?
  • @ChuckWalbourn : D3DX11SaveTextureToFile 给出“尝试创建启用了调试层但未安装该层的设备” Directx::SaveWICTextureToFile 给出“不支持此类接口”
  • D3DX11 已被弃用并且多年未更新,因此错误输出可能试图将E_NOINTERFACE 变成有意义的东西,但它不再是有意义的了。您能准确告诉我ScreenGrab.cppDirectXTexWIC.cpp 中的哪一行代码您在哪里看到此错误生成?
  • @ChuckWalbourn : IWICImagingFactory* pWIC = _GetWIC(); 失败,返回为 E_NOINTERFACE
  • 您使用的是什么操作系统?您使用的是哪个 vcxproj/sln 文件或 NuGet 版本的 DirectXTex?根据您构建代码的方式,_GetWIC 将尝试使用 WIC2,然后使用 WIC1,或者只使用 WIC1。见this post

标签: c++ windows directx screenshot direct3d11


【解决方案1】:

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

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

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

完成后别忘了致电CoUninialize()。这是因为 WIC 使用 COM,必须在使用前进行初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2012-09-15
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多