我设法从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允许这种类型的数据处理,有人可以发表评论吗?