请教一个函数的用法,大人请进... 我在做一个抓屏的东西(全屏),现在得到了HBITMAP h了,不知道怎么取得它的数据(缓冲区内容)及大小。查了一下说是要用GetDiBits() api函数,但不知道怎么用,老不成功。请大人指教,来一段例子代码,先谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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,都比第一种简单。总之,方法很多~ 我用楼上的代码怎么得出的数据大小不对阿,超过(1024*768*3)了;顺便问一下,取出的数据能用vfw中的IC打头的压缩解压函数来压解吗?怎么老是解压不成功呢?郁闷阿 可我发现用vfw做的摄像头程序捕捉出来的数据大小正好是那样计算出来的阿,刚才不知道怎么又好了。 这一步棋究竟怎么走 再次高分悬赏------网页控件问题 大家快来下孙鑫老师的VC和Java教学视频教程啊!免费的,全套的! 关于Visual C++的参考书 MFC中CArray的Bug? 如何修改菜单上的文字 关于读取ini文件中字段的函数? 如何在下拉菜单的某项上右击鼠标键弹出一新的弹出菜单? 关于CODE REVIEW事项 New!!!关于标签控件的使用 寻求使用UDP穿透防火墙的技术资料。 关于程序响应回车按键
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,都比第一种简单。
总之,方法很多~
顺便问一下,取出的数据能用vfw中的IC打头的压缩解压函数来压解吗?怎么老是解压不成功呢?郁闷阿