Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
 Аватар для CyberGenius
1 / 1 / 1
Регистрация: 23.08.2012
Сообщений: 100

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

27.02.2014, 08:15. Показов 5375. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Стоит передо мной задача делать скриншоты определенной части экрана и последующая обработка их через OpenCV. Пытался нагуглить готовые примеры создания скришотов экрана, но найденные примеры отказывались компилироваться либо вываливались с кучей ошибок. Подскажите каким образом можно создавать скриншоты определенной части экрана и сохранять их в файл. Или, подойдет и такой вариант, сохранение скриншота в какой то внутренний формат, который поймет и сможет обработать OpenCV, без сохранения на жесткий диск.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.02.2014, 08:15
Ответы с готовыми решениями:

Создание нормального скриншота масштабированного экрана
Как создать скриншот масштабированного экрана? Для понимания поясню. На ноутбуках 15,6 дюймов с FullHD матрицей при 100 % элементы слишком...

Выделение определённой области экрана
Если в кратце, то мне надо чтобы по нажатию на кнопку надо было сделать 2 клика и выделить область экрана, отрисовать там полупрозрачный...

Cкриншот определенной области экрана
У меня есть код который делает скриншот экрана!!! как его переделать таким образом что бы бралось изображение не всего экрана а...

6
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
27.02.2014, 08:30
Screener
мб поможет
0
 Аватар для CyberGenius
1 / 1 / 1
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 08:44  [ТС]
dzrkot, там программа на Делфи. Мне бы либо примеры на С++, либо направление куда копать...
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
27.02.2014, 09:08
у kde есть приложение Ksnapshot, исходники открыты, у него как раз есть функция создания скриншота окна приложения, посмотрев исходники думаю можно разобраться как она это делает....
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
27.02.2014, 09:15
CyberGenius, посмотрите в сторону GetDC( HWND_DESKTOP ).

Добавлено через 2 минуты
Оно?
http://stackoverflow.com/quest... into-a-mat
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
27.02.2014, 11:30
Цитата Сообщение от CyberGenius Посмотреть сообщение
Пытался нагуглить готовые примеры создания скришотов экрана, но найденные примеры отказывались компилироваться либо вываливались с кучей ошибок.
а может стоило ошибки почитать и исправить?

Как создать скриншот части экрана?
0
 Аватар для CyberGenius
1 / 1 / 1
Регистрация: 23.08.2012
Сообщений: 100
27.02.2014, 18:35  [ТС]
Нашел такой код. В 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 );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2014, 18:35
Помогаю со студенческими работами здесь

Очистка экрана в определенной области
есть ли такая ф-я, которая очищает экран в определенной области? например, очистить с 3 строки 4 колонки по 5й строки 6 колонки.

Распознание текста в определённой области экрана
Помогите пожалуйста с написанием программы. по распознованию текста в определённой области экрана компьютера

Отлов цвета в определенной области экрана
Всем доброго времени суток. На сколько сложно реализовать такой механизм? Хочется автоматизировать некоторые вещи. Ситуация такая: в...

Создание таблицы-контейнера из определенной области формы
Пишу компонент который может держать в себе другие и в runtime режиме может менять размеры контейнеров. Так вот.Как сделать...

Получение скриншота экрана
Привет всем! Пытаюсь получить скриншот экрана: QDesktopWidget *desktop = MyApplication::desktop(); QPixmap pic =...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru