Как можно сделать скриншот на c++?

Пользователь

от steve , в категории: C/C++ , год назад

Как можно сделать скриншот на c++?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от cayla , 10 месяцев назад

@steve 

В C++ нет нативных функций для создания скриншотов, так как язык предназначен для работы с программированием и не имеет возможности взаимодействовать с графическим интерфейсом операционной системы напрямую.


Однако, есть несколько путей для создания скриншотов в C++:

  1. Использование сторонних библиотек, таких как OpenCV или Qt, которые предоставляют функции для работы с изображениями и экраном. Эти библиотеки могут использовать специальные функции операционной системы для получения скриншотов.
  2. Использование системных вызовов операционной системы для создания скриншота. В Windows, можно использовать функцию BitBlt и другие функции из библиотеки GDI (Graphical Device Interface). В Linux, можно использовать функцию XGetImage из библиотеки Xlib.


Ниже приведен пример кода для создания скриншота с использованием библиотеки OpenCV:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <opencv2/opencv.hpp>

int main() {
    // Создание объекта для хранения изображения
    cv::Mat screenshot;
    
    // Захват скриншота и сохранение его в объекте изображения
    cv::VideoCapture cap(0);
    cap >> screenshot;
    
    // Сохранение скриншота в файл
    cv::imwrite("screenshot.png", screenshot);
    
    return 0;
}


Обратите внимание, что в этом примере используется библиотека OpenCV, поэтому вам потребуется установить ее и настроить проект для работы с ней.

Пользователь

от ella , 2 месяца назад

@steve 

Вот пример кода для создания скриншота на Windows с использованием WinAPI:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <windows.h>

int main() {
    // Получение хэндла рабочего стола
    HDC hDC = GetDC(NULL);

    // Создание битмапа с размерами экрана
    int width = GetDeviceCaps(hDC, HORZRES);
    int height = GetDeviceCaps(hDC, VERTRES);
    HBITMAP hBitmap = CreateCompatibleBitmap(hDC, width, height);

    // Создание DC для битмапа и копирование экрана в битмап
    HDC memDC = CreateCompatibleDC(hDC);
    HGDIOBJ oldBitmap = SelectObject(memDC, hBitmap);
    BitBlt(memDC, 0, 0, width, height, hDC, 0, 0, SRCCOPY);

    // Сохранение битмапа в файл
    PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER));
    // Установка параметров изображения
    pbih->biSize = sizeof(BITMAPINFOHEADER);
    pbih->biWidth = width;
    pbih->biHeight = height;
    pbih->biPlanes = 1;
    pbih->biBitCount = 24;
    pbih->biCompression = BI_RGB;
    pbih->biSizeImage = 0;
    pbih->biXPelsPerMeter = 0;
    pbih->biYPelsPerMeter = 0;
    pbih->biClrUsed = 0;
    pbih->biClrImportant = 0;

    HANDLE hFile = CreateFile("screenshot.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    BITMAPFILEHEADER hdr;
    hdr.bfType = 0x4d42;
    hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + width * height * 3);
    hdr.bfReserved1 = 0;
    hdr.bfReserved2 = 0;
    hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);

    DWORD dwTemp;
    WriteFile(hFile, &hdr, sizeof(BITMAPFILEHEADER), &dwTemp, NULL);
    WriteFile(hFile, pbih, sizeof(BITMAPINFOHEADER), &dwTemp, NULL);
    DWORD cb = (width * 3 + 3) / 4 * 4 * height;
    WriteFile(hFile, hBitmap, cb, &dwTemp, NULL);
    CloseHandle(hFile);

    // Освобождение ресурсов
    GlobalFree(pbih);
    SelectObject(memDC, oldBitmap);
    DeleteDC(memDC);
    ReleaseDC(NULL, hDC);
    DeleteObject(hBitmap);

    return 0;
}


Этот код использует функции WinAPI для создания скриншота и сохранения его в битмап файле "screenshot.bmp". Помните, что WinAPI работает только на Windows, поэтому он не будет работать на других операционных системах.