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

Custom output resolution DuplicateOutput DXGI

本文关键字:输出 DXGI 分辨率 自定义      更新时间:2023-10-16

我正在使用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;

我的屏幕是1920x1080,例如,我想在1280x720中获得图像。我在queryinterface功能上遇到了错误。有人可以告诉我我想念什么吗?还是有任何解决方案可以更轻松地自定义分辨率?谢谢

桌面重复API为您提供桌面的副本,作为质地最少的纹理。也就是说,不包括缩放。您可以抓住框架并根据需要将它们缩小,但这不是桌面重复或期望为您做的。

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

  • 调整SharpDx中的DXGI资源或纹理2D

此外,您可以使用Media Foundation的视频处理器MFT,如果您不使用Media Foundation,则可以使用媒体基金会,但可能会出现不方便的外形,但可以通过Direct3d 11以有效的方式使用Direct3D 11进行适当设置量表。

另请参见有关启用GPU的缩放的另一个相关API:

  • DXVA视频处理 - 示例7:伸展和裁剪视频