Изображение окна C ++ в цикле вызывает задержку - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь получить изображение окна, чтобы получить данные о пикселях.Следующий фрагмент выполняется внутри цикла.Кажется, что все работает нормально, но через несколько минут запуска приложение начинает зависать.Я предполагаю, что есть какая-то утечка памяти.Я надеюсь, что кто-то может указать на то, что я делаю здесь неправильно.

void ScreenShot(LPCSTR filename)
{
    RECT DesktopParams;
    GetWindowRect(hwnd, &DesktopParams);
    DWORD Width = DesktopParams.right - DesktopParams.left;
    DWORD Height = DesktopParams.bottom - DesktopParams.top;

    DWORD FileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (sizeof(RGBTRIPLE) + 1 * (Width*Height * 4));
    char *BmpFileData = (char*)GlobalAlloc(GMEM_FIXED, FileSize);

    PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData;
    PBITMAPINFOHEADER  BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)];

    BFileHeader->bfType = 0x4D42; // BM
    BFileHeader->bfSize = sizeof(BITMAPFILEHEADER);
    BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

    BInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
    BInfoHeader->biPlanes = 1;
    BInfoHeader->biBitCount = 24;
    BInfoHeader->biCompression = BI_RGB;
    BInfoHeader->biHeight = Height;
    BInfoHeader->biWidth = Width;

    RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
    RGBTRIPLE color;

    HDC CaptureDC = CreateCompatibleDC(DevC);
    HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC, Width, Height);
    SelectObject(CaptureDC, CaptureBitmap);
    BitBlt(CaptureDC, 0, 0, Width, Height, DevC, 0, 0, SRCCOPY | CAPTUREBLT);
    GetDIBits(CaptureDC, CaptureBitmap, 0, Height, Image, (LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);



    RGBTRIPLE *pixel = get_pixel(BInfoHeader, Image, 100, 100);
    cout << (int)pixel->rgbtRed << ", " << (int)pixel->rgbtBlue << "," << (int)pixel->rgbtGreen << endl;
    GlobalFree(BmpFileData);

}

После еще одного тестирования я понял, что, если я закомментирую get_pixel, lage исчезнет.

RGBTRIPLE * get_pixel(PBITMAPINFOHEADER  BInfoHeader, RGBTRIPLE *Image, int x, int y)
{
    return &Image[(BInfoHeader->biHeight - 1 - y)*BInfoHeader->biWidth + x];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...