直接从设备上下文优化屏幕捕获

时间:2012-11-06 05:10:10

标签: windows visual-c++ screenshot gdi

我设法从Bitmap对象获取缓冲区指针,如下所示:

hDesktopWnd=GetDesktopWindow();
hDesktopDC=GetDC(hDesktopWnd);

  // Get Screen Dimensions 

  int         nWidth=GetSystemMetrics(SM_CXSCREEN);
  int         nHeight=GetSystemMetrics(SM_CYSCREEN);

  CImage objCImg;
  objCImg.Create( nWidth, nHeight, 24, BI_RGB);

   HDC hdcMemDC = objCImg.GetDC();

   if(!BitBlt(hdcMemDC,0,0,nWidth, nHeight,hDesktopDC, 0,0,SRCCOPY))
    {
        printf("Error during Bitblt");
    }

   unsigned char* pData = (unsigned char*)objCImg.GetBits();

我可以使用此pData修改图像。

我正在尝试优化屏幕捕获时序,但即使此操作只包含一个 BitBlt ,仍然此操作在我的PC上耗时94ms。而

// Get the Desktop windows handle and device context
hDesktopWnd=GetDesktopWindow();
hDesktopDC=GetDC(hDesktopWnd);

// Get the handle to the existing DC and create a bitmap file object    
HDC         hBmpFileDC=CreateCompatibleDC(hDesktopDC);
HBITMAP     hBmpFileBitmap=CreateCompatibleBitmap(hDesktopDC,nWidth,nHeight);

//    Assign the object in Memory DC to the bitmap and perform a bitblt
  SelectObject(hBmpFileDC,hBmpFileBitmap);
  BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hDesktopDC,0,0,SRCCOPY|CAPTUREBLT);

  pBuf=malloc(bmpInfo.bmiHeader.biSizeImage); // Size of Image
  GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf,&bmpInfo,DIB_RGB_COLORS);   

此操作在 GetDIBits 中有一个 BitBlt 和一个内存复制操作,但这个总操作在我的电脑上需要46毫秒。

有人可以澄清两个BitBlt操作中的这种差异,以及为什么在第一种情况下DC不是作为兼容DC(CreateCompatibleDC)派生时,bitblt花费更多时间,因为根据我的理解,BitBlt几乎类似于 memcpy 操作。

Inturn我还想问有没有办法直接从hdc访问图像缓冲区指针。 这意味着可以直接从HDC获得指向图像的缓冲区指针

hDesktopWnd=GetDesktopWindow();
hDesktopDC=GetDC(hDesktopWnd);
// Now derive buffer from this **hDesktopDC**

我之前也问了同样的问题:Unable to access buffer data

此外,如果Windows允许这种类型的数据处理,有人可以发表评论吗?

0 个答案:

没有答案