Форум программистов, компьютерный форум CyberForum.ru

Создание скриншота определенной области экрана - C++

Восстановить пароль Регистрация
 
CyberGenius
 Аватар для CyberGenius
1 / 1 / 0
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 08:15     Создание скриншота определенной области экрана #1
Добрый день.
Стоит передо мной задача делать скриншоты определенной части экрана и последующая обработка их через OpenCV. Пытался нагуглить готовые примеры создания скришотов экрана, но найденные примеры отказывались компилироваться либо вываливались с кучей ошибок. Подскажите каким образом можно создавать скриншоты определенной части экрана и сохранять их в файл. Или, подойдет и такой вариант, сохранение скриншота в какой то внутренний формат, который поймет и сможет обработать OpenCV, без сохранения на жесткий диск.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
27.02.2014, 08:30     Создание скриншота определенной области экрана #2
Screener
мб поможет
CyberGenius
 Аватар для CyberGenius
1 / 1 / 0
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 08:44  [ТС]     Создание скриншота определенной области экрана #3
dzrkot, там программа на Делфи. Мне бы либо примеры на С++, либо направление куда копать...
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
27.02.2014, 09:08     Создание скриншота определенной области экрана #4
у kde есть приложение Ksnapshot, исходники открыты, у него как раз есть функция создания скриншота окна приложения, посмотрев исходники думаю можно разобраться как она это делает....
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
27.02.2014, 09:15     Создание скриншота определенной области экрана #5
CyberGenius, посмотрите в сторону GetDC( HWND_DESKTOP ).

Добавлено через 2 минуты
Оно?
http://stackoverflow.com/questions/1...map-into-a-mat
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
27.02.2014, 11:30     Создание скриншота определенной области экрана #6
Цитата Сообщение от CyberGenius Посмотреть сообщение
Пытался нагуглить готовые примеры создания скришотов экрана, но найденные примеры отказывались компилироваться либо вываливались с кучей ошибок.
а может стоило ошибки почитать и исправить?

Как создать скриншот части экрана?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2014, 18:35     Создание скриншота определенной области экрана
Еще ссылки по теме:

Создание объекта в области памяти C++
C++ Отследить изменение области экрана
Найти сумму в определенной области, заданной пользователем C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyberGenius
 Аватар для CyberGenius
1 / 1 / 0
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 18:35  [ТС]     Создание скриншота определенной области экрана #7
Нашел такой код. В VS2012 он успешно строится, но после запуска вылазит исключение:

C++
1
Unhandled exception at at 0x7621B727 in ConsoleApplication1.exe: Microsoft C++ exception: cv::Exception at memory location 0x0040FA3C.
C++
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include< windows.h >
#include< opencv2/opencv.hpp >
 
class Screen{
public:
    Screen(){
        // Параметры экрана
        HWND hwnd = GetDesktopWindow(); 
        hWDC = GetWindowDC( hwnd );
        width = GetSystemMetrics( SM_CXSCREEN );
        height = GetSystemMetrics( SM_CYSCREEN );
 
        // Совместимый контекст в памяти
        hScreen = CreateCompatibleDC( hWDC ); // - DeleteDC( hScreen );
        hBM = CreateCompatibleBitmap( hWDC, width, height ); // - DeleteObject( hBM );
        hBM_Temp = SelectObject( hScreen, hBM ); // - SelectObject( hScreen, hBM_Temp );
 
        // Описание рабочего массива бит совместимого контекста в памяти
        BMI.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
        BMI.bmiHeader.biWidth = width;
        BMI.bmiHeader.biHeight = -height;
        BMI.bmiHeader.biPlanes = 1;
        BMI.bmiHeader.biBitCount = 24;
        BMI.bmiHeader.biCompression = BI_RGB;
 
        // Массив данных скриншота
        const int colorSize = 3; // Размер пикселя
        const int alignment = 4; // Выравнивание строки      
        int step = ( int )ceil( width * colorSize / ( double )alignment ) * alignment; // Шаг строки
        //int step = ( width * colorSize / alignment + ( width * colorSize % alignment? 1: 0 ) ) * alignment; // Шаг строки
        data = new char[ step * height ]; // - delete[] data;
 
        // Скриншот
        screen = new cv::Mat( height, width, CV_8UC3, data, step ); // - delete screen;
    };
 
    ~Screen(){
        SelectObject( hScreen, hBM_Temp );
        DeleteObject( hBM );
        DeleteDC( hScreen );
        delete screen; screen = NULL;
        delete[] data; data = NULL;
    };
 
    cv::Mat& get(){
        BitBlt( hScreen, 0, 0, width, height, hWDC, 0, 0, SRCCOPY );
        GetDIBits( hScreen, hBM, 0, height, data, &BMI, DIB_RGB_COLORS );
        return *screen;
    };
 
private:
    HDC hWDC; // Контекст экрана
    HDC hScreen; // Совместимый с экраном контекст в памяти
    HBITMAP hBM; // Рабочий массив бит совместимого контекста в памяти
    BITMAPINFO BMI; // Описание рабочего массива бит совместимого контекста в памяти
 
    int width; // Ширина экрана в пикселях
    int height; // Высота экрана в пикселях
 
    char* data; // Массив данных скриншота
    cv::Mat* screen; // Скриншот
 
    HGDIOBJ hBM_Temp; // Массив бит совместимого контекста в памяти созданный по умолчанию  
};
 
int main(){
    Screen sh;
    cv::Mat screen = sh.get();
    cv::imwrite( "D:\\snapshot.png", screen );
    return 0;
}
При этом ошибка перестает появляться, если закомментировать строку
C++
1
cv::imwrite( "D:\\snapshot.png", screen );
Yandex
Объявления
27.02.2014, 18:35     Создание скриншота определенной области экрана
Ответ Создать тему
Опции темы

Текущее время: 00:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru