Я пытаюсь, чтобы моя программа сделала скриншот, а затем отформатировала данные таким образом, чтобы их можно было легко манипулировать из моей программы.
До сих пор я придумал следующее решение:
/**
* Creates a screenshot of the entire screen
* @param img - 2d array containing RGB values of screen pixels.
*/
void get_screenshot(COLORREF** img, const Rectangle &bounds)
{
// get the screen DC
HDC hdc_screen = GetDC(NULL);
// memory DC so we don't have to constantly poll the screen DC
HDC hdc_memory = CreateCompatibleDC(hdc_screen);
// bitmap handle
HBITMAP hbitmap = CreateCompatibleBitmap(hdc_screen, bounds.width, bounds.height);
// select the bitmap handle
SelectObject(hdc_memory, hbitmap);
// paint onto the bitmap
BitBlt(hdc_memory, bounds.x, bounds.y, bounds.width, bounds.height, hdc_screen, bounds.x, bounds.y, SRCPAINT);
// release the screen DC
ReleaseDC(NULL, hdc_screen);
// get the pixel data from the bitmap handle and put it into a nice data structure
for(size_t i = bounds.x; i < bounds.x + bounds.width; ++i)
{
for(size_t j = bounds.y; j < bounds.y + bounds.height; ++j)
{
img[j-bounds.y][i-bounds.x] = GetPixel(hdc_memory, i, j);
}
}
// release our memory DC
ReleaseDC(NULL, hdc_memory);
}
* Примечание. Прямоугольник - это на самом деле структура, которую я создал с 4 size_t
полями для верхней левой координаты x & y, а также шириной и высотой прямоугольника.Это не прямоугольник WinAPI.
У меня было несколько вопросов по поводу этого кода:
- Правильно ли я освобождаю все ресурсы?
- Есть ли лучший способсделай это?Я ищу что-то с аналогичным уровнем сложности и гибкости, который имел бы 2d массив значений RGB.Окончательная обработка данных снимка экрана будет выполнена с помощью OpenCL, поэтому я бы предпочел не иметь какой-либо сложной структуры.