[图像处理] MFC载入图片并绘制ROI矩形

news/2024/7/21 4:09:43 标签: 图像处理, mfc

上一篇:
[图像处理] MFC载入图片并进行二值化处理和灰度处理及其效果显示

文章目录

  • 前言
  • 完整代码
  • 重要代码
  • 效果

前言

上一篇实现了MFC通过Picture控件载入图片。
这一篇实现ROI功能的第一部分,在Picture控件中,通过鼠标拖拽画出一个矩形。

完整代码

MFC简单的图片处理工程-Gitee

重要代码

鼠标左键按下事件,记录左键按下时的坐标。

void CGDITESTDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	ClientToScreen(&point);
	GetDlgItem(IDC_PIC_DISPLAY)->GetWindowRect(&rc_dsp);
	if (rc_dsp.PtInRect(point)) //判断鼠标左键落下时,point是否在控件的rect范围内
	{
		m_startPt = point;
	}

	CDialogEx::OnLButtonDown(nFlags, point);
}

鼠标左键抬起事件,记录左键抬起时的坐标,并在Picture控件的DC中绘制矩形

void CGDITESTDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	CRect rect;
	int rect_width = 0;
	int rect_height = 0;
	CPoint sel_pos;
	//GetCursorPos(&sel_pos);
	ClientToScreen(&point);
	GetDlgItem(IDC_PIC_DISPLAY)->GetWindowRect(&rc_dsp);
	if (rc_dsp.PtInRect(point) && m_IsChoose)//判断鼠标左键抬起时,point是否在控件的rect范围内
	{
		//ClipCursor(&rc_dsp);

		//计算ROI的topleft和rightbottom坐标
		if(point.x > m_startPt.x)
			m_endPt.x = point.x < rc_dsp.right? point.x:rc_dsp.right;
		else
			m_endPt.x = point.x > rc_dsp.left ? point.x : rc_dsp.left;

		if (point.y > m_startPt.y)
			m_endPt.y = point.y < rc_dsp.bottom ? point.y : rc_dsp.bottom;
		else
			m_endPt.y = point.y > rc_dsp.top ? point.y : rc_dsp.top;
#if 1
		CPoint tplt, rtbt;
		tplt.x = m_startPt.x < m_endPt.x ? m_startPt.x : m_endPt.x;
		tplt.y = m_startPt.y < m_endPt.y ? m_startPt.y : m_endPt.y;
		rtbt.x = m_startPt.x > m_endPt.x ? m_startPt.x : m_endPt.x;
		rtbt.y = m_startPt.y > m_endPt.y ? m_startPt.y : m_endPt.y;
		m_ctl_pic_dsp.ScreenToClient(&tplt);
		m_ctl_pic_dsp.ScreenToClient(&rtbt);
		
		CDC* pDC = m_ctl_pic_dsp.GetWindowDC();
		CPen pen(PS_SOLID, 1, RGB(255,0,0));
		pDC->SelectStockObject(NULL_BRUSH);
		pDC->SelectObject(&pen);
		pDC->Rectangle(CRect(tplt, rtbt));
#else
		//这里我本想在获取ROI的框选坐标后,通过dlg的OnPaint()函数来画矩形
		// 所以使用了以下两个函数激活OnPaint()
		// 但是却无法在picture控件上画矩形
		// 百度了一下,原因是要在picture控件的dc中画,而不是在dialog的dc中画。
		//Invalidate(); //清空窗口的客户区,激活OnPaint()
		//SendMessage(WM_PAINT);  //激活OnPaint()
#endif
	}

	CDialogEx::OnLButtonUp(nFlags, point);
}

效果

在这里插入图片描述


http://www.niftyadmin.cn/n/5474812.html

相关文章

hadoop分布式计算组件

什么是计算、分布式计算&#xff1f; 计算&#xff1a;对数据进行处理&#xff0c;使用统计分析等手段得到需要的结果 分布式计算&#xff1a;多台服务器协同工作&#xff0c;共同完成一个计算任务 分布式计算常见的2种工作模式 分散->汇总(MapReduce就是这种模式)中心调…

【STL】list的底层原理及其实现

文章目录 list的介绍list的整体结构设计list的构造代码模拟实现&#xff1a; list节点类的实现list 迭代器Iterator的使用以及实现Iterator的使用Iterator的底层实现反向迭代器 list与vector的比较实现list类 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

uniapp中uni.navigateTo传递变量

效果展示&#xff1a; 核心代码&#xff1a; uniapp中uni.navigateTo传递变量 methods: {changePages(item) {setDatas("maintenanceFunName", JSON.stringify(item)).then((res) > {uni.navigateTo({url: /pages/PMS/maintenance/maintenanceTypes/maintenanceT…

Django检测到会话cookie中缺少HttpOnly属性手工复现

一、漏洞复现 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本等)获取到用户的cookie信息&#xff0c;造成用户cookie信息泄露&#xff0c;增加攻击者的跨站脚本攻击威胁。 第一步&#xff1a;复制URL&#xff1a;http://192.168.43.219在浏览器打开&#xff0c;…

MacOS 升级14.4.1后vscode无法远程连接

今天上班第一天&#xff0c;开始提示MacOS可以升级&#xff0c;顺手就点击了升级重启&#xff0c;版本显示 14.4.1 (23E224) 同时今天vscode升级到了1.88 此时大多数的VSCODE远程服务器无法连接&#xff0c;不管用不用VPN都不可以&#xff0c;报错大致包括如下信息 hostname …

Docker【1】:Docker制作Oracle19C镜像

Docker【1】&#xff1a;Docker制作Oracle19C镜像 1、参考官方文档2、下载相关文件2.1、工具包2.2、Oracle安装包 3、制作镜像3.1、拷贝下载的oracle安装包到制作工具对应版本目录下3.2、开始制作镜像包3.3、制作完成 4、导出导入镜像4.1、镜像导出4.2、镜像导入 5、运行Oracle…

npm发布包至私有仓库

前提&#xff1a;使用verdaccio在服务器搭建好了私有仓库 1、登录至私服 npm adduser --registryhttp://xxx.xxx.x.xx:48732、发布npm包到私有仓库 修改package.json中的相关信息后 #cd 项目目录 npm publish --registryhttp://xxx.xxx.x.xx:4873登录至私服查看 3、在项目中…

iOS 17.5系统或可识别并禁用未知跟踪器,苹果Find My技术应用越来越合理

苹果公司去年与谷歌合作&#xff0c;宣布将制定新的行业标准来解决人们日益关注的跟踪器隐私问题。苹果计划在即将发布的 iOS 17.5 系统中加入这项提升用户隐私保护的新功能。 科技网站 9to5Mac 在苹果发布的 iOS 17.5 开发者测试版内部代码中发现了这项反跟踪功能的蛛丝马迹…