(一)MFC读取并显示一幅位图图像,并获取鼠标点击位置的像素坐标和灰度值_获取鼠标所点处的颜色值mfc_金萨巴的博客-程序员秘密

技术标签: 获取像素点坐标和灰度值  BMP位图  读取显示图像  数字图像处理  MFC  

      题目是老师布置的一道作业题,要求用C或C++完成,但不能用VTK/Opencv等软件包,经过很多摸索之后实现了该功能,后续可能还有其他功能要实现,所以先写一篇博客记录下,一方面是方便自己以后使用,另一方面是给其他人做个参考,少走一些弯路。说不定以后学弟学妹们就看到了这篇博客(猜猜我是哪个学校的?)

一、作业要求

要求读取一幅位图图像,即BMP位图,并显示该图像在对话框内。鼠标点击该图像时,显示所点击的像素坐标值和RGB灰度分量。

编译环境:vs2015

二、实现步骤

(一)创建对话框MFC

选择基于对话框的MFC,其他后面的都是默认选项,所以可以直接点击完成即可。

点击完成之后出现如下对话框

把中间的对话框放大,把确定取消两个botton修改为打开图片保存图片,并增加一个图像控件框和五个编辑框,如下图所示

MFC创建就结束了

(二)添加程序

双击打开图片按钮添加程序,如下图所示

添加代码如下:

//打开文件 
	CString filter = (CString)"图像文件(*.bmp)|*.bmp;*.BMP||";//指明可供选择的文件类型和相应的扩展名
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, NULL);  //打开文件

//按下确定按钮 dlg.DoModal() 函数显示对话框
	if (dlg.DoModal() == IDOK)
	{
		//打开对话框获取图像信息
		CString BmpName = dlg.GetPathName();     //获取文件路径名   
		CString EntName = dlg.GetFileExt();      //获取文件扩展名
		EntName.MakeLower();                     //将文件扩展名转换为一个小写字符

		if (EntName.Compare(_T("bmp")) == 0)  //如果是bmp图片则打开显示
		{
			//定义变量存储图片信息
			BITMAPINFO *pBmpInfo;       //记录图像信息头内容
			BYTE *pBmpData;             //图像数据
			BITMAPFILEHEADER bmpHeader; //文件头
			BITMAPINFOHEADER bmpInfo;   //信息头
			CFile bmpFile;              //记录打开文件

				//以只读的方式打开文件 读取bmp图片各部分 bmp文件头 信息 数据
			if (!bmpFile.Open(BmpName, CFile::modeRead | CFile::typeBinary))
				return;
			if (bmpFile.Read(&bmpHeader, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
				return;
			if (bmpFile.Read(&bmpInfo, sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
				return;
			pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
			//为图像数据申请空间
			memcpy(pBmpInfo, &bmpInfo, sizeof(BITMAPINFOHEADER));  //存储图像信息头内容
			DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;//图像数据大小,单位为字节
			pBmpData = (BYTE*)new char[dataBytes];
			bmpFile.Read(pBmpData, dataBytes);  //存储图像数据
			bmpFile.Close();

			//显示图像
			CStatic *pwnd = (CStatic*)GetDlgItem(IDC_STATIC);  //里面的参数是图片控件的ID
			//pwnd->SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
			pwnd->ModifyStyle(0xf, SS_BITMAP);
			pwnd->SetBitmap((HBITMAP)::LoadImage(GetModuleHandle(NULL), BmpName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE));//打开图片


		}
	}

此时已经可以打开图片了,效果如下:

 

接下来天加显示坐标值和灰度值的代码:

在类向导里添加消息函数WM_LBUTTONDOWN

添加代码:

代码如下:

void CWJ_zuoye1Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CRect rect;
	CWnd *pWnd = GetDlgItem(IDC_STATIC);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(&rect);

	//先获取鼠标相对于屏幕的坐标
	GetCursorPos(&point);
	int temp_x = point.x;
	int temp_y = point.y;
	//然后得到static控件的rect坐标
	CRect pRect;
	pWnd->GetClientRect(&pRect);
	//最后把当前鼠标的坐标转化为相对于rect的坐标
	pWnd->ScreenToClient(&point);
	int x = point.x;
	int y = point.y;
	SetDlgItemInt(IDC_EDIT1, x);     //写入坐标值
	SetDlgItemInt(IDC_EDIT2, y);     //写入

	HDC hDC = ::GetDC(NULL);

	COLORREF rgb = ::GetPixel(hDC, temp_x, temp_y);
	int r = GetRValue(rgb);
	int g = GetGValue(rgb);
	int b = GetBValue(rgb);
	SetDlgItemInt(IDC_EDIT3, r);     //写入
	SetDlgItemInt(IDC_EDIT4, g);     //写入
	SetDlgItemInt(IDC_EDIT5, b);     //写入

	CDialogEx::OnLButtonDown(nFlags, point);
}

编辑运行:

大概就是这么个情况,时间有限,下一篇我将讲一下上面的代码含义以及相关引用 ,对代码含义有要求的同学可以看我的下篇博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39270311/article/details/82890502

智能推荐

网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,_飞人小天使的博客-程序员秘密

牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k, * 顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。 */

JAVA WEB实现图书管理系统 —— 登录、注册页面_图书管理系统登录页面_小朱同学的笔记本的博客-程序员秘密

本文章要实现的功能如下:1、首页未登录状态:2、首页已登录状态:(这篇文章先不涉及下方图书信息的显示,该部分内容将在后续文章进行)3、登录:4、注册:

org.gradle.process.internal.ExecException: Process 'command 'D:\Program Files\Java\jdk1.7.0_13\bin\_zpc15200790194的博客-程序员秘密

今天使用android studio打包时出现此错误 ,  org.gradle.process.internal.ExecException: Process 'command 'D:\Program Files\Java\jdk1.7.0_13\bin\java.exe'' finished with non-zero exit value 2  ,解决方案如下,修改build.gradle文

使用durid的ConfigFilter对数据库密码加密_松门一枝花的博客-程序员秘密

原文连接:http://blog.csdn.net/aixiaoyang168/article/details/49930513-----------------------------------------------------------------------对于大部分程序员来说,数据库的信息,如用户名,密码等信息一般都写到配置文件中,便于修改和维护,然而这对于运维安全来说确实一个很大的...

qdir 自动创建多级目录_[转载]Qt实现遍历文件夹和文件目录(递归)_康上明学的博客-程序员秘密

bool FindFile(const QString &amp; path){QDir dir(path);if (!dir.exists())return false;dir.setFilter(QDir::Dirs|QDir::Files);dir.setSorting(QDir::DirsFirst);QFileInfoList list = dir.entryInfoList();int...

JFrame下面加带滚动条的JTextArea无法显示?_jtextpane不出横滚动条_strong tyj的博客-程序员秘密

今天 写程序 遇到一个问题,就是直接在JFrame下面加带滚动条的JTextArea,无法 显示出来(不带 滚动条的我没试过不太清楚)结果原因是没有加上JPanel先将JTextArea加上滚动条,再将滚动条到JP anel上面,最后将JPanel加到JFame,完成!可以 显示! super("֪知识补全"); this.set...

随便推点

人工智能的伦理问题_novel ai 伦理_wentizhongren的博客-程序员秘密

随着人工智能技术的发展,关于AI伦理问题的讨论越来越热。在某些领域,AI机器人正在取代许多人的工作,在自动驾驶汽车和某些医疗项目中,AI正在代替人类进行生死抉择。AI未来将给人类带来什么影响?人类又将如何处理AI的伦理问题呢?越来越多人对此深感忧虑。  首先,按照人工智能的定义,我们可以得出该机器人获得了人类完全的思维能力,他(暂且用“他”)拥有我们相同的思维、情感、创造力乃至不可预测性。

决策树:挑出好西瓜_WOOZI9600L²的博客-程序员秘密

目录一、概念二、ID3决策树算法1.信息熵2.信息增益3. 增益率(gain ratio)4. 基尼指数(Gini index)5.python编码实现参考资料一、概念决策树在机器学习中也是比较常见的一种算法,属于监督学习中的一种。看字面意思应该也比较容易理解,相比其他算法比如支持向量机(SVM)或神经网络,似乎决策树感觉“亲切”许多。优点:计算复杂度不高,输出结果易于理解,对中间值的缺失值不敏感,可以处理不相关特征数据。缺点:可能会产生过度匹配的问题。使用数据类型:数值型和标称型。最经典的

camera主观测试分析软件,camera主观测试经验分享浅析.ppt_蒋四金法考的博客-程序员秘密

Camera主观测试经验分享;camera常用术语;白平衡;示例:荧光环境下,设置各白平衡条件进行对比;使用自动白平衡设置(AWB)会将日落场景中特有的色彩削弱;混合光源: 在很多场景中,光线的色温并不是单一的,而是由不同色温的光线混合而成,比如日光与阴影;感光度;锐度;饱和度/亮度/色度;饱和度取决于该色中含色成分和消色成分(灰色)的比例。含色成分越大,饱和度越大;消色成分越大,饱和度越小。纯的...

MFC自绘TAB控件_天上的猩猩Y的博客-程序员秘密

以下是两种tab控件的具体图片:你可以根据自己的具体需求进行选择.第一种:1:第二种:1:2:第一种下载链接:http://download.csdn.net/detail/qq_23992597/9673873第二种下载链接:http://download.csdn.net/detail/qq_23992597/9673868

SGAME的日志系统_nmsoccer的博客-程序员秘密

综述SGAME框架所使用的日志系统基于一个小的日志库slog,具体细节可以参考https://github.com/nmsoccer/slog其安装也很简单,会在/usr/local/lib下生成一个slog.a静态库(主要免去到目标机器时各种部署动态库的麻烦,而且便于调试). slog有一个slog.go作为GO的API,在框架里已经包含源码SGAME的日志目录位于sgame/lib/log,内容如下sgame/lib/log/|-- api.go`-- slog.go..

MyBatis高级(分页插件、MyBatis缓存)_mybatisplus对分页数据进行缓存_vid。的博客-程序员秘密

目标:1.MyBatis的分页插件【掌握】2.MyBatis缓存【了解】3.MyBatis注解【扩张掌握】4.MyBatis逆向工程【掌握】一、使用pageHelper插件完成分页分页功能是非常常用的在我们实际开发中。优点:简化分页开发,提高开发效率使用pageHelper可以轻松的更改数据库企业使用的非常广泛下载地址:https://github.com/pageHelper/Mybatis-pageHelper第一步:我们可以使用Maven进行配置,将依赖项添加到pom.x

推荐文章

热门文章

相关标签