请教一个函数的用法,大人请进...

starytx 2008-03-25 06:45:29
我在做一个抓屏的东西(全屏),现在得到了HBITMAP h了,不知道怎么取得它的数据(缓冲区内容)及大小。查了一下说是要用GetDiBits() api函数,但不知道怎么用,老不成功。请大人指教,来一段例子代码,先谢了!
...全文
99 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2008-03-26
  • 打赏
  • 举报
回复
可我发现用vfw做的摄像头程序捕捉出来的数据大小正好是那样计算出来的阿,刚才不知道怎么又好了。
ringphone 2008-03-26
  • 打赏
  • 举报
回复
我用楼上的代码怎么得出的数据大小不对阿,超过(1024*768*3)了;
-------------
想想看,有3字节的数据类型吗?所以得到的是1024*768*4数据
starytx 2008-03-26
  • 打赏
  • 举报
回复
我用楼上的代码怎么得出的数据大小不对阿,超过(1024*768*3)了;
顺便问一下,取出的数据能用vfw中的IC打头的压缩解压函数来压解吗?怎么老是解压不成功呢?郁闷阿
yebeans 2008-03-25
  • 打赏
  • 举报
回复
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,都比第一种简单。
总之,方法很多~

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧