Как захватить кадровый буфер HDR в Windows? - PullRequest
3 голосов
/ 27 июня 2019

Я использую следующий код для чтения стандартного 8-битного кадрового буфера, однако мне нужно прочитать 10-битный кадровый буфер HDR, который используется для HDR-контента на моем HDR-мониторе.

Насколько я могу судить, BI_RGB - единственная соответствующая опция enum. Вот то, что у меня есть, которое работает для 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);
}

1 Ответ

2 голосов
/ 28 июня 2019

Direct3D добавил функции, связанные с HDR, в последние обновления API, которые используют новый интерфейс с последними цифрами. Чтобы получить к ним доступ, сначала необходимо запросить их базовые объекты.

Пример:

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 , которая описывает доступное цветовое пространство, биты на компонент, основные красные / зеленые / синие цвета, точку белого и диапазон яркостей, доступных на устройстве.

...