我想将屏幕某个窗口的图像数据拷贝到我自己定义的一个内存缓冲区中,我曾经试着通过窗口的DC,利用GetPixel函数得到每个点的数据,但这样太慢了,后来又通过创建一个内存兼容DC和兼容位图,将窗口的数据先拷贝到内存兼容位图中,再通过GetDIBits获取,但总是不成功,请问有比较快的方法吗?

解决方案 »

  1.   

    BITMAPINFOHEADER bmiHdr;
    memset(&bmiHdr, 0, sizeof(bmiHdr)); // initialize to zero is neccessary
    bmV4Hdr.bV4Size = sizeof(bmiHdr);// receive bitmap header infomations
    GetDIBits(hDC, hBitmap, 0, 0, NULL, (LPBITMAPINFO)&bmiHdr, DIB_RGB_COLORS);LPBYTE pszDIB = new BYTE[bmiHdr.biSize + bmiHdr.biSizeImage];
    memcpy(pszDIB, &bmiHdr, sizeof(bmiHdr));// receive the DIB bits
    GetDIBits(hDC, hBitmap, 0, bmiHdr.biHeight, 
    pszDIB + bmiHdr.biSize, (LPBITMAPINFO)pszDIB, DIB_RGB_COLORS);LPVOID pvDIBits = pszDIB + bmiHdr.biSize;pvDIBits 保存了返回的位图数据。以上代码省略了错误处理及 8-bit 调色板位图的处理,此外,数据的格式和 bmiHdr.biBitCount 有关,其中每个扫描行的字节数为:#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)