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

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

27.02.2014, 08:15. Показов 5312. Ответов 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
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru