获取窗口快照并裁剪它

时间:2014-09-23 08:40:30

标签: c++ winapi screenshot bitmapimage snapshot

我有以下代码正常工作,它会在我的应用程序上获取活动窗口的快照,将其放入HBITMAP变量并将其保存在文件中。 现在我希望能够根据给定的起始坐标和宽度/高度裁剪图像并仅保存一部分图像。

重要的一点是,我必须使用标题栏保存窗口,而不仅仅是客户区,因此使用PrintWindow()而不是BitBlt()方法很容易实现。

我更喜欢使用PrintWindow()的解决方案,因为BitBlt()方法没有正确使用标题栏(除非你知道这样做的方法)。

适用于整个窗口的当前代码是:

HWND hParentWindow = GetActiveWindow();

    RECT rc;
    GetWindowRect(hParentWindow, &rc);
    int width = rc.right - rc.left;
    int height = rc.bottom - rc.top;

    //create
    HDC hdcParent = GetDC(NULL);
    HDC hdc = CreateCompatibleDC(hdcParent);
    HBITMAP hBmp = CreateCompatibleBitmap(hdcParent, width, height);
    SelectObject(hdc, hBmp);

    //Print to memory hdc
    PrintWindow(hParentWindow, hdc, 0);

    //copy to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBmp);
    CloseClipboard();

    // Save it in a file:
    saveBitmap(ofn.lpstrFile, hBmp);

    //release
    DeleteDC(hdc);
    DeleteObject(hBmp);
    ReleaseDC(NULL, hdcParent);

如何保存裁剪的位图?

2 个答案:

答案 0 :(得分:0)

基本上做一个BitBlt。以下是一个讨论此问题的线程,其解决方案似乎足以满足您的需求:

Crop function BitBlt(...)

答案 1 :(得分:0)

  • 创建另一个中级hdc
  • 将窗口打印到此中间hdc。
  • 将您需要的矩阵从此hdc复制(bitblt)到您的位图hdc
  • 重新启动中间hdc