我在做一个抓屏的东西(全屏),现在得到了HBITMAP h了,不知道怎么取得它的数据(缓冲区内容)及大小。查了一下说是要用GetDiBits() api函数,但不知道怎么用,老不成功。请大人指教,来一段例子代码,先谢了!

解决方案 »

  1.   

    bmpInfo是位图属性,lpvBits指向的是位图的像素值缓冲区
    HDC hDc = CreateCompatibleDC(NULL); 
    BYTE *lpvBits = NULL;
    int nRet;
    BITMAPINFO bmpInfo;
    ZeroMemory(&bmpInfo,sizeof(bmpInfo));
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);/*    第一次调用GetDIBits获得bmpInfo    */nRet = ::GetDIBits(hDc, sm.hBitmap, 0, 0, NULL, &bmpInfo, DIB_RGB_COLORS); 
    if (nRet == 0) {
    nRet = GetLastError();
    TRACE( _T("GetDIBits for bmpInfo failed %d\n"), nRet);
    }
    lpvBits= new BYTE[bmpInfo.bmiHeader.biSizeImage];
    if (NULL == lpvBits) {
    nRet = -1;
    TRACE( _T("Allocate memory for lpvBits failed\n"));
    }
    nRet = GetBitmapBits(sm.hBitmap,bmpInfo.bmiHeader.biSizeImage,lpvBits);
    /*    第二次调用GetDIBits获得位图数据    */
    //nRet = ::GetDIBits(hDc, sm.hBitmap, 0, bmpInfo.bmiHeader.biHeight, lpvBits, &bmpInfo, DIB_RGB_COLORS); 
    if (nRet == 0) {
    nRet = GetLastError();
    TRACE( _T("GetDIBits for lpvBits failed %d\n"), nRet);
    }另外也可以用CBitmap::FromHandle()生成一个临时的CBitmap来处理。
    或者是用CxImage的CreateFromHBITMAP,都比第一种简单。
    总之,方法很多~
      

  2.   

    我用楼上的代码怎么得出的数据大小不对阿,超过(1024*768*3)了;
    顺便问一下,取出的数据能用vfw中的IC打头的压缩解压函数来压解吗?怎么老是解压不成功呢?郁闷阿
      

  3.   

    可我发现用vfw做的摄像头程序捕捉出来的数据大小正好是那样计算出来的阿,刚才不知道怎么又好了。