如何在Windows中捕获HDR帧缓冲?

3
我使用下面的代码读取标准的8位帧缓冲器,但我需要读取用于HDR显示器上HDR内容的10位帧缓冲器。
据我所知,BI_RGB 是唯一相关的枚举选项。以下是我目前为止的代码,适用于8位通道:
#include <iostream>
#include <windows.h>
#include <fstream>

void capture_screen() {
 int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
 int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);

 HWND hDesktopWnd = GetDesktopWindow();
 HDC hDesktopDC = GetDC(NULL);
 HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);

 HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
 SelectObject(hCaptureDC, hCaptureBitmap);

 BitBlt(hCaptureDC, 0, 0, nScreenWidth, nScreenHeight, hDesktopDC, 0, 0, SRCCOPY | CAPTUREBLT);

 BITMAPINFO bmi = { 0 };

 bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
 bmi.bmiHeader.biWidth = nScreenWidth;
 bmi.bmiHeader.biHeight = nScreenHeight;

 bmi.bmiHeader.biPlanes = 1;
 bmi.bmiHeader.biBitCount = 32;
 bmi.bmiHeader.biCompression = BI_RGB;

 auto* pPixels = new RGBQUAD[nScreenWidth * nScreenHeight];

 GetDIBits(hCaptureDC, hCaptureBitmap, 0,nScreenHeight, pPixels, &bmi, DIB_RGB_COLORS);

 //...               
 delete[] pPixels;

 ReleaseDC(hDesktopWnd, hDesktopDC);
 DeleteDC(hCaptureDC);
 DeleteObject(hCaptureBitmap);
}

在使用Win 8及更高版本时,最好使用桌面复制API来捕获桌面。 - VuVirt
1个回答

1
最近的API更新中,Direct3D添加了与HDR相关的功能,使用了一个带有最后数字的新接口。要访问它们,您必须先查询它们的基础对象。
例如:
IDXGIOutput* output = /* initialize output */;
IDXGIOutput6* output6;
HRESULT hr = output->QueryInterface(__uuidof(IDXGIOutput6), (void**)&output6);
if(SUCCEEDED(hr)) {
    // Use output6...
    output6->Release();
} else {
    // Error!
}

只有安装了足够新的Windows SDK版本,才能成功编译此代码。仅当用户拥有足够新的Windows 10版本时,代码才能成功执行(而不是失败并显示错误代码)。
然后,您可以通过调用函数IDXGIOutput6::GetDesc1来查询监视器功能。您将得到填充的DXGI_OUTPUT_DESC1结构,该结构描述了设备上可用的色彩空间、每个组件的位数、红/绿/蓝原色、白点以及亮度范围。

谢谢!有几件事情:首先,我应该如何初始化IDXGIOutput?(我对C++还比较新)。此外,使用它是否可以获取特定像素值? - Richard Robinson
@RichardRobinson 很抱歉现在才回复你。由于您是这个领域的新手,我为您提供了一些示例。https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/D2DAdvancedColorImages - Strive Sun
使用这种方法能否获得每个像素的RGB组件? - Richard Robinson
@RichardRobinson 我没有尝试使用 DirectX 来获取 HDR 的特定像素值,但根据当前的数据,DirectX 更多地涉及颜色渲染。您可以参考 directx 的官方文档,其中展示了如何获取 metadata 结构。 - Strive Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接