Image resize with CImage VS2019 C++

388 Views Asked by At

I am using a CImage class to save screenshots of the desktop. Since the desktop is in 1920x1080 the images are also in 1920x1080. However, since i want to do some work on those images and their size makes it very computationally expensive and slows the whole process. i wanted to know how to resize the images before they are saved to a file. I used the stretchblt() function, although i get the correct size of image the image itself is all black. Any help will be greatly appreciated. The code is below:

void GDIInitScreenCapture()
{
    _screen_capture_worker.nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    _screen_capture_worker.nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    _screen_capture_worker.hDesktopWnd = GetDesktopWindow();
    _screen_capture_worker.hDesktopDC = GetDC(_screen_capture_worker.hDesktopWnd);
    _screen_capture_worker.hCaptureDC = CreateCompatibleDC(_screen_capture_worker.hDesktopDC);

    _screen_capture_worker.hCaptureBitmap = CreateCompatibleBitmap(_screen_capture_worker.hDesktopDC,
    _screen_capture_worker.nScreenWidth, _screen_capture_worker.nScreenHeight);

    SelectObject(_screen_capture_worker.hCaptureDC, _screen_capture_worker.hCaptureBitmap);
}

void GDIReleaseScreenCapture()
{
    ReleaseDC(_screen_capture_worker.hDesktopWnd, _screen_capture_worker.hDesktopDC);
    DeleteDC(_screen_capture_worker.hCaptureDC);
    DeleteObject(_screen_capture_worker.hCaptureBitmap);
}

bool GDITakeScreenshots(std::string file_name)
{
    BitBlt(_screen_capture_worker.hCaptureDC, 0, 0, 
    _screen_capture_worker.nScreenWidth, _screen_capture_worker.nScreenHeight,
    _screen_capture_worker.hDesktopDC, 0, 0, SRCCOPY | CAPTUREBLT);
    CImage image;
    CImage simage;
    simage.Create(640, 480, 24);
    image.Attach(_screen_capture_worker.hCaptureBitmap);
    SetStretchBltMode(simage.GetDC(), HALFTONE);
    image.StretchBlt(simage.GetDC(), 0, 0, 640, 480, SRCCOPY);
    simage.Save(file_name.c_str(), Gdiplus::ImageFormatJPEG);
    simage.ReleaseDC();

    return true;
}
0

There are 0 best solutions below