代码之家  ›  专栏  ›  技术社区  ›  Stepan Yakovenko

opencv桌面捕获在大字体模式下只返回部分屏幕

  •  0
  • Stepan Yakovenko  · 技术社区  · 7 年前

    我用这个标准的样本来抓取opencv的屏幕如果控制面板中的字体大小为100%,则可以正常工作:

    Mat hwnd2mat(HWND hwnd) {
        HDC hwindowDC, hwindowCompatibleDC;
        int height, width, srcheight, srcwidth;
        HBITMAP hbwindow;
        Mat src;
        BITMAPINFOHEADER  bi;
        hwindowDC = GetDC(hwnd);
        hwindowCompatibleDC = CreateCompatibleDC(hwindowDC);
        SetStretchBltMode(hwindowCompatibleDC, COLORONCOLOR);
        RECT windowsize;    // get the height and width of the screen
        GetClientRect(hwnd, &windowsize);
        srcheight = windowsize.bottom;
        srcwidth = windowsize.right;
        height = windowsize.bottom / 1;  //change this to whatever size you want to resize to
        width = windowsize.right / 1;
        src.create(height, width, CV_8UC4);
        // create a bitmap
        hbwindow = CreateCompatibleBitmap(hwindowDC, width, height);
        bi.biSize = sizeof(BITMAPINFOHEADER);    //http://msdn.microsoft.com/en-us/library/windows/window/dd183402%28v=vs.85%29.aspx
        bi.biWidth = width;
        bi.biHeight = -height;  //this is the line that makes it draw upside down or not
        bi.biPlanes = 1;
        bi.biBitCount = 32;
        bi.biCompression = BI_RGB;
        bi.biSizeImage = 0;
        bi.biXPelsPerMeter = 0;
        bi.biYPelsPerMeter = 0;
        bi.biClrUsed = 0;
        bi.biClrImportant = 0;
        SelectObject(hwindowCompatibleDC, hbwindow);
        StretchBlt(hwindowCompatibleDC, 0, 0, width, height, hwindowDC, 0, 0, srcwidth, srcheight, SRCCOPY); //change SRCCOPY to NOTSRCCOPY for wacky colors !
        GetDIBits(hwindowCompatibleDC, hbwindow, 0, height, src.data, (BITMAPINFO *)&bi, DIB_RGB_COLORS);  //copy from hwindowCompatibleDC to hbwindow
        DeleteObject(hbwindow);
        DeleteDC(hwindowCompatibleDC);
        ReleaseDC(hwnd, hwindowDC);
        return src;
    }
    
    int main() {
        HWND hwndDesktop = GetDesktopWindow();
        Mat src = hwnd2mat(hwndDesktop);
        imwrite("output.bmp", src);
        return 0;
    }
    

    但如果我启用大字体(至少在Windows10上),那么它只会显示屏幕的左上角:

    enter image description here

    我该怎么解决?

    2 回复  |  直到 7 年前
        1
  •  2
  •   user7860670    7 年前

    我认为您需要通过创建 corresponding manifest entry 是的。否则应用程序将处理dpi虚拟化。

        2
  •  0
  •   Stepan Yakovenko    7 年前

    另一个解决方案可能是在程序的开头调用setprocessdpiaware()。帮了我。