我使用以下代码读取标准的8位帧缓冲区,但是我需要读取用于HDR监视器上HDR内容的10位HDR帧缓冲区。
据我所知,BI_RGB
是唯一相关的枚举选项。到目前为止,这是适用于8位 channel 的内容:
#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);
}
最佳答案
Direct3D
已在最近的API更新中添加了与HDR相关的功能,这些功能使用了最后一位数字的新接口(interface)。要访问它们,您必须首先查询其基础对象。
例子:
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结构填充,该结构描述了可用的色彩空间,每个组件的位数,红色/绿色/蓝色基色,白点以及设备上可用的亮度范围。
关于c++ - 如何在Windows中捕获HDR帧缓冲区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56797583/