得到图像变化率

本文介绍了一个在Windows环境下实现视频显示与处理的示例代码。该代码通过使用Windows API来获取窗口的设备上下文(Device Context, DC),并创建兼容的DC用于处理视频帧。此外,还演示了如何通过BitBlt函数进行位图复制,以及如何创建和使用位图(HBITMAP)和设备上下文(HDC)。最后,文章展示了如何将处理后的图像展示在指定的窗口中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void showVideo(HWND dlgHwnd, HWND curHwnd)
{

	HDC curHDC = NULL;

	RECT rc; 
	HDC hDesDC = NULL;
	RECT rect;

	HDC curHMemDC = NULL;

	HWND picDWnd = NULL;
	curHDC = ::GetWindowDC(curHwnd);

	//创建兼容DC

	::GetWindowRect(curHwnd, &rc);

	//得到目标位图
	HDC hBufDC;
	HDC hBufDC2;
	HDC hBufDC3;
	HBITMAP hBitmap, hBitmap2, hBitmap3,hBitTemp;
	//创建设备上下文(HDC)
	hBufDC = CreateCompatibleDC(curHDC);
	hBufDC2 = CreateCompatibleDC(curHDC);
	hBufDC3 = CreateCompatibleDC(curHDC);
	//创建HBITMAP
	hBitmap = CreateCompatibleBitmap(curHDC, rc.right - rc.left, rc.bottom - rc.top);
	hBitTemp = (HBITMAP)SelectObject(hBufDC, hBitmap);

	hBitmap2 = CreateCompatibleBitmap(curHDC, rc.right - rc.left, rc.bottom - rc.top);
	hBitTemp = (HBITMAP)SelectObject(hBufDC2, hBitmap2);

	hBitmap3 = CreateCompatibleBitmap(curHDC, rc.right - rc.left, rc.bottom - rc.top);
	hBitTemp = (HBITMAP)SelectObject(hBufDC3, hBitmap3);

	////得到位图缓冲区
	//BitBlt(hBufDC, 0, 0, rc.right - rc.left, rc.bottom - rc.top, curHDC, 0, 0, SRCCOPY);
	for (int i = 0; i < 10; i++)
	{

		//if (FALSE == PrintWindow(curHwnd, hBufDC2, PW_CLIENTONLY))
		//{
		//	::PostMessage(dlgHwnd, WM_IS_VIDEO, 0, (LPARAM)curHwnd);
		//	MessageBox(NULL, _T("Error"), _T("cwnd"), MB_OK);
		//}

		//Sleep(100);

		//if (FALSE == PrintWindow(curHwnd, hBufDC3, PW_CLIENTONLY))
		//{
		//	::PostMessage(dlgHwnd, WM_IS_VIDEO, 0, (LPARAM)curHwnd);
		//	MessageBox(NULL, _T("Error"), _T("cwnd"), MB_OK);
		//}

		BitBlt(hBufDC2, 0, 0, rc.right - rc.left, rc.bottom - rc.top, curHDC, 0, 0, SRCCOPY);
		Sleep(100);
		//得到差分图像
		BitBlt(hBufDC2, 0, 0, rc.right - rc.left, rc.bottom - rc.top, curHDC, 0, 0, SRCINVERT);
		//累加差分分量
		BitBlt(hBufDC, 0, 0, rc.right - rc.left, rc.bottom - rc.top, hBufDC2, 0, 0, SRCPAINT);
	}

	//////得到差分图像

	////处理目标位图

	////得到位图缓冲区
	//BitBlt(hBufDC2, 0, 0, rc.right - rc.left, rc.bottom - rc.top, curHDC, 0, 0, SRCCOPY);
	//Sleep(500);
	////得到差分图像
	//BitBlt(hBufDC2, 0, 0, rc.right - rc.left, rc.bottom - rc.top, curHDC, 0, 0, SRCINVERT);





	////合并差分图
	//BitBlt(hBufDC, 0, 0, rc.right - rc.left, rc.bottom - rc.top, hBufDC2, 0, 0, SRCPAINT);

	//SendMessage(curHwnd, WM_PRINT, (WPARAM)hBufDC, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);
	//处理目标位图
	GetGrayBitmap(hBitmap);




	picDWnd = ::GetDlgItem(dlgHwnd, IDC_VISION);



	::GetWindowRect(picDWnd, &rect);

	hDesDC = ::GetWindowDC(picDWnd);

	::SetStretchBltMode(hDesDC, COLORONCOLOR);
	::StretchBlt(hDesDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top, hBufDC, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY);
	Sleep(100);
	//释放内存
	DeleteObject(hBitmap3);
	DeleteObject(hBitmap2);
	DeleteObject(hBitmap);
	DeleteObject(hBitTemp);
	::DeleteDC(hBufDC);
	::DeleteDC(hBufDC2);
	::DeleteDC(hBufDC3);
	::ReleaseDC(curHwnd, curHDC);
	::ReleaseDC(picDWnd, hDesDC);
	//InvalidateRect(picDWnd, &rect, TRUE);



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值