Ответы пользователя по тегу C++
  • Как получить RGB значение кординат X Y на изображение с помощью opencv?

    @Limons Автор вопроса
    В общем я стал использовать
    image.at<cv::Vec3b>(y, x);

    Но суть была в том, что тип возвращаемого значения Point3_ т.е. 3 1-байтовых символа. Для этого достаточно
    преобразовать в unsigned char
    Ответ написан
    Комментировать
  • Как сохранить фотографию из bitmap?

    @Limons Автор вопроса
    Вообщем забросил я тот код и просто написал новый.
    Я почти на 100% уверен, что ошибка была в неправильном использование Gdiplus -- GDI+ нового поколения, можете погуглить кому интересно, разобраться более подробно.

    Вот код, который фоткает весь экран:
    #include <windows.h>
    #include <stdio.h>
    #include <iostream>
    
    #include <gdiplus.h>
    
    using namespace std;
    
    #pragma comment(lib, "GdiPlus.lib") 
    using namespace Gdiplus; 
    
    
    static const GUID png =
    { 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };
    
    
    int main()
    {
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
        HDC scrdc, memdc;
        HBITMAP membit;
    
        scrdc = GetDC(0);
        int Height, Width;
        Height = GetSystemMetrics(SM_CYSCREEN);
        Width = GetSystemMetrics(SM_CXSCREEN);
    
        memdc = CreateCompatibleDC(scrdc);
        membit = CreateCompatibleBitmap(scrdc, Width, Height);
        SelectObject(memdc, membit);
    
        BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
        HBITMAP hBitmap;
        hBitmap = (HBITMAP)SelectObject(memdc, membit);
        Gdiplus::Bitmap bitmap(hBitmap, NULL);
        bitmap.Save(L"c:\screen.png", &png);
    
        DeleteObject(hBitmap);
        //GdiplusShutdown(gdiplusToken); не моуг понять, но происходит нарушение прав доступа. Вероятно  gdiplusToken удаляется какой-то функцией, самоуничтожается в плане.
        return 0;
    }


    Вот код, который фоткает лишь окно какого-либо приложения по HWND:
    #include <windows.h>
    #include <stdio.h>
    #include <iostream>
    
    #include <gdiplus.h>
    
    using namespace std;
    
    #pragma comment(lib, "GdiPlus.lib") 
    using namespace Gdiplus; 
    
    
    static const GUID png =
    { 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };
    
    void screenShote(HWND hWnd);
    
    int main()
    {
        HWND hWnd = FindWindowA("Класс", "Заголовок"); // можно поставить 0 вместо заголвка или класса окна, тогда будет выполнен поиск только по одному из аргументов
        screenShote(hWnd);
        return 0;
    }
    
    void screenShote(HWND hWnd) {
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
        HDC scrdc, memdc;
        HBITMAP membit;
    
        scrdc = GetDCEx(hWnd, 0, DCX_WINDOW);
        int Height, Width;
        RECT sizeWindow;
        GetWindowRect(hWnd, &sizeWindow);
    
        Height = sizeWindow.bottom - sizeWindow.top;
        Width = sizeWindow.right - sizeWindow.left;
    
        memdc = CreateCompatibleDC(scrdc);
        membit = CreateCompatibleBitmap(scrdc, Width, Height);
        SelectObject(memdc, membit);
    
        BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
        HBITMAP hBitmap;
        hBitmap = (HBITMAP)SelectObject(memdc, membit);
        Gdiplus::Bitmap bitmap(hBitmap, NULL);
        bitmap.Save(L"c:\\screen.png", &png);
    
        DeleteObject(hBitmap);
        //GdiplusShutdown(gdiplusToken); не моуг понять, но происходит нарушение прав доступа. Вероятно  gdiplusToken удаляется какой-то функцией, самоуничтожается в плане.
    }
    Ответ написан
    Комментировать
  • Bitmap.Save() - не работает, с++, что делать?

    @Limons
    Ещё не совсем понятно, точнее что вообще-то зачем это:
    Gdiplus::Bitmap bitmap(hBitmap, NULL);

    И не понятно:
    Почему HGDIOBJ old_obj = SelectObject(hDc, hBitmap);
    А не SelectObject(hDc, hBitmap);
    Ответ написан
    Комментировать