C++ 自定义输出分辨率重复输出DXGI

C++ 自定义输出分辨率重复输出DXGI,c++,directx,screenshot,screen-capture,dxgi,C++,Directx,Screenshot,Screen Capture,Dxgi,我正在使用AcquireNextFrame制作桌面截图。是否可以在设置中设置我想要的输出图像的尺寸? 我在文档中看到了这个函数IDXGIOutput::SetDisplaySurface,这可能会有所帮助。 这是我的密码: //Here I init a output texture with less resolution D3D11_TEXTURE2D_DESC desc; desc.Width = 1280; desc.Height = 720; desc

我正在使用
AcquireNextFrame
制作桌面截图。是否可以在设置中设置我想要的输出图像的尺寸? 我在文档中看到了这个函数
IDXGIOutput::SetDisplaySurface
,这可能会有所帮助。 这是我的密码:

//Here I init a output texture with less resolution 
    D3D11_TEXTURE2D_DESC desc;
    desc.Width = 1280;
    desc.Height = 720;
    desc.MipLevels = desc.ArraySize = 1;
    desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    desc.SampleDesc.Count = 1;
    desc.Usage = D3D11_USAGE_DYNAMIC;
    desc.BindFlags = 0;
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
    desc.MiscFlags = 0;

    ID3D11Texture2D *pTexture = NULL;
    gDevice->CreateTexture2D(&desc, NULL, &pTexture);
    IDXGISurface *surface = nullptr;
    hr = gDevice->QueryInterface(__uuidof(IDXGISurface), reinterpret_cast<void **>(&pTexture));
    if (FAILED(hr))
        return;
    // Here I should make lDxgiOutput->setDisplaySurface(surface)
    hr = lDxgiOutput->GetDesc(&gOutputDesc);
    if (FAILED(hr))
        return;
    IDXGIOutput1 *lDxgiOutput1 = nullptr;
    hr = lDxgiOutput->QueryInterface(IID_PPV_ARGS(&lDxgiOutput1));
    if (FAILED(hr))
        return;
    lDxgiOutput->Release();
    hr = lDxgiOutput1->DuplicateOutput(gDevice, &gDeskDupl);
    if (FAILED(hr))
        return;
//这里我初始化了一个分辨率较低的输出纹理
D3D11_纹理2 d_描述;
描述宽度=1280;
描述高度=720;
desc.MipLevels=desc.ArraySize=1;
描述格式=DXGI_格式_R8G8B8A8_UNORM;
desc.SampleDesc.Count=1;
描述用法=D3D11\u用法\u动态;
desc.BindFlags=0;
desc.CPUAccessFlags=D3D11_CPU_访问_读取| D3D11_CPU_访问_写入;
desc.miscsflags=0;
ID3D11Texture2D*pTexture=NULL;
gDevice->CreateTexture2D(&desc、NULL和pTexture);
IDXGISurface*表面=nullptr;
hr=gDevice->QueryInterface(uuu uuidof(IDXGISurface),reinterpret_cast(&pTexture));
如果(失败(小时))
返回;
//在这里,我应该使lDxgiOutput->setDisplaySurface(surface)
hr=lDxgiOutput->GetDesc(&gOutputDesc);
如果(失败(小时))
返回;
IDXGIOutput1*lDxgiOutput1=nullptr;
hr=lDxgiOutput->QueryInterface(IID_PPV_ARGS(&lDxgiOutput1));
如果(失败(小时))
返回;
lDxgiOutput->Release();
hr=lDxgiOutput1->DuplicateOutput(gDevice和gDeskDupl);
如果(失败(小时))
返回;
我的屏幕是1920x1080,我想以1280x720为例获得图像。 我在
queryinterface
函数上遇到错误。 有人能告诉我我错过了什么吗?或者有没有更容易自定义分辨率的解决方案?
谢谢

桌面复制API以最小的开销为您提供桌面纹理副本。也就是说,不包括缩放。您可以根据自己的意愿抓取帧并缩小它们,但这并不是桌面复制为您所做或期望为您所做的

这个问题提出了几种方法(这个问题也与桌面复制有关):

另外,如果你不使用媒体基础,那么你可以使用媒体基金会,它有点不灵活,可能有不方便的形式因素,但是使用Direct3D 11以有效的方式正确地设置刻度。 另请参见另一个有关GPU启用的扩展的相关API:


谢谢您的回答!问题是,使用AcquireNextFrame,我得到的是DirtyRect和MoveRect。我是从桌面的初始分辨率中得到的。因此,如果缩放纹理2D,脏和移动矩形将不会与新缩放的纹理同步。。。这是个大问题。这就是为什么我要求一个已经被缩放的输出。。。可惜微软没有考虑到这一点……如果你缩放纹理,你可以分别缩放矩形,不是吗?桌面复制为您提供了足够的输入,您拥有进一步处理数据所需的一切。是的,这是真的。。我必须做正确的计算。并非不可能。说实话,我仍然没有成功地简单地缩放纹理。。。我应该使用SharpDX吗?没有教程显示正确执行此操作的步骤。我曾经使用过视频处理器MFT,我知道它工作得很好。但我没有可参考的示例代码。我想Direct2D也可以正常工作。我将解释Direct2D缩放步骤的问题链接起来。DXVA链接主要是为了完整性,我认为由于复杂性,您不应该采用此路径。