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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Паттерн Interpreter и грамматика http://www.cyberforum.ru/cpp-beginners/thread1106556.html
Может не особо по теме C++, но все же. Столкнулся с некоторой трудностью. Читал про паттерн Interpreter, который, вроде как , служит для описания какого-либо языка. Как пример взяты римские числа, с которыми я , по правде говоря, не очень знаком. Перед кодом описана грамматика языка, вот чтобы понять код мне бы понять сперва грамматику, а я совершенно не понимаю на каком языке написаны эти...
C++ Чтение непосредственного значения из памяти Здравствуйте. Мне необходимо представить числа с плавающей точкой двойной точности в hex формате. есть ли возможность использовать значение из памяти в том виде, в котором оно там и представлено? самому не хочется совсем писать функцию перевода, и в стандартных библиотеках нет вроде такого http://www.cyberforum.ru/cpp-beginners/thread1106550.html
C++ Теория графики
Вобщем в кратце. Кто может подсказать литературу по теории графики? Если проще построение маленькой 2D игры и разные поведения главного объекта игры с другими.(к примеру как обойти препятствие?). За ранее спасибо!!!
Вычисления в цикле, нахождение ежедневного прироста C++
Здравствуйте, при решении задачи, столкнулся с проблемой задания цикла для нахождения ежедневного прироста и выделения в последующем максимального значения. Кода программы как такового нет, #include "stdafx.h" #include <math.h> #include <conio.h> #include <stdio.h> int main() {
C++ Корректировка кода Хаффмана http://www.cyberforum.ru/cpp-beginners/thread1106504.html
Приветствую друзья, появились затруднения с кодом Хаффмана, здесь представил исходник . Суть в том, что он работает только с целочисленными вероятностями, а хотелось бы, чтобы была возможность использовать дробные. Допустим, чтобы он смог реализовать пример: На входе: символы 2 4 6 a b их вероятности 0.4 0.4 0 0 0.2 соответственно. В данном случаи, создаётся впечатление, что код...
C++ мужики!выручите пожалуйста! задан одномерный массив B состоящем из n вещественных элементов, задан одномерный массив B состоящем из n вещественных элементов,определить позиции,в которых находятся отрицательные элементы,сосчитать их количество отрицательных элементов и вычислить их сумму, надо написать в визуал си++ подробнее

Показать сообщение отдельно
CyberGenius
 Аватар для CyberGenius
1 / 1 / 0
Регистрация: 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 );
 
Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru