求高效读取屏幕区域像素值完整代码

muststudyhard 2018-01-23 01:32:34
加精
将矩形区域屏幕像素值存储于二维数组以便计算特征识别数字

参数不太懂设置,直接给我完整代码吧 每秒要能读2次,在VS2017下编译通过的
...全文
8420 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-20
  • 打赏
  • 举报
回复
引用 12 楼 OExpress 的回复:
呵呵,记得有个CDib类可以完成这一切
一种马甲而已。
  • 打赏
  • 举报
回复
马甲人人会穿,各有巧妙不同。
worldy 2018-03-19
  • 打赏
  • 举报
回复
使用CreateDIBSection ,将窗口数据BitBlt到内存DC然后直接操作内存
CyberLogix 2018-03-19
  • 打赏
  • 举报
回复
呵呵,记得有个CDib类可以完成这一切
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
CreateDIBSection 亮了!
  • 打赏
  • 举报
回复
schlafenhamster 2018-03-15
  • 打赏
  • 举报
回复

/*************************************************************************
 *
 * \函数名称:
 *   CopyScreenToDIB
 *
 * \输入参数:
 *   LPRECT	lpRect			- 需要拷贝的屏幕区域
 *   CDib*	pDibDest		- 指向目标CDib对象的指针
 *
 * \返回值:
 *   BOOL				- 如果操作成功,则返回TRUE
 *
 * \说明:
 *   该函数将指定矩形位置内的屏幕内容拷贝到DIB中源CDib类pDibSrc中的数据拷贝到pDibDst中
 *
 *************************************************************************
 */
BOOL CopyScreenToDIB(LPRECT lpRect, CDib* pDibDest)
{
	// 屏幕设备上下文和内存设备上下文句柄
	HDC         hScrDC, hMemDC;         
	// 声明BITMAP临时句柄和以前的BITMAP句柄
	HBITMAP     hBitmap, hOldBitmap;    
	// 调色板句柄
	HPALETTE    hPalette;       
	// 获取矩形区域的坐标
	int         nX, nY, nX2, nY2;
	// DIB图象的高度和宽度
	int         nWidth, nHeight; 
	// 屏幕分辨率
	int         xScrn, yScrn;    
	// 如果给定的矩形区域为空,则不进行进一步的处理
	if (IsRectEmpty(lpRect)) return FALSE; 
   	// 得到一个屏幕设备上下文
	hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); 
	// 创建与屏幕设备兼容的内存设备上下文
	hMemDC = CreateCompatibleDC(hScrDC); 
	// 得到矩形的区域坐标
	nX = lpRect->left; 
	nY = lpRect->top; 
	nX2 = lpRect->right; 
	nY2 = lpRect->bottom; 
	// 得到屏幕的分辨率,以便后面的判断处理
	xScrn = GetDeviceCaps(hScrDC, HORZRES); 
	yScrn = GetDeviceCaps(hScrDC, VERTRES); 
	// 判断矩形区域是否超出屏幕
	if (nX < 0) nX = 0; 
	if (nY < 0) nY = 0; 
	if (nX2 > xScrn) nX2 = xScrn; 
	if (nY2 > yScrn) nY2 = yScrn; 
	// 计算DIB图象的高度和宽度
	nWidth = nX2 - nX; 
	nHeight = nY2 - nY; 
	// 创建一个与屏幕设备上下文兼容的DDB位图
	hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); 
	// 将DDB位图选入内存设备上下文
	hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); 
	// 将屏幕中指定区域的图象传输到内存设备上下文中
	BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); 
	// 然后将以前的图象选入,并得到屏幕区域的DDB图象句柄
	hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); 
	// 将临时的设备上下文删除
	DeleteDC(hScrDC); 
	DeleteDC(hMemDC); 
	// 得到当前系统调色板
	hPalette = GetSystemPalette(); 
	// 将DDB图象转换为DIB图象
	pDibDest->ConvertFromDDB(hBitmap,hPalette);
	// 删除临时对象
	DeleteObject(hPalette); 
	DeleteObject(hBitmap); 
	
	return TRUE;
}
weixin_39783387 2018-03-14
  • 打赏
  • 举报
回复
很棒,很好,谢谢楼主分享
  • 打赏
  • 举报
回复
就是 CreateCompatibleDC CreateDIBSection // 直接取到像素数据的指针 从屏幕BitBlt到建立的DC 从指针直接读像素 分分钟的事,还要什么完整代码 结帖率:0%可是信誉度不高哦
line_us 2018-01-26
  • 打赏
  • 举报
回复
看看各位高招
  • 打赏
  • 举报
回复
见你的另一个帖子
赵4老师 2018-01-24
  • 打赏
  • 举报
回复
参考http://www.autohotkey.comImageSearch功能对应源代码。
zgl7903 2018-01-23
  • 打赏
  • 举报
回复
差不多就是 GetDIBits 的应用 http://blog.csdn.net/iamshuke/article/details/5749948

19,468

社区成员

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

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