题目是老师布置的一道作业题,要求用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);
}

编辑运行:

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

(一)MFC读取并显示一幅位图图像,并获取鼠标点击位置的像素坐标和灰度值相关推荐

  1. (一)MFC读取并显示一幅位图图像,并获取鼠标点击位置的像素坐标和灰度值(接上篇博客)

    上篇博客简要介绍了如何利用MFC读取并显示一幅位图图像,并获取鼠标点击位置的像素坐标和灰度值信息,主要包含了对话框的创建和添加程序,代码也在上一页中给了大家,但是并没有详细说明功能,所以在这一节当中主 ...

  2. vs2015+opencv3.2+mfc读取摄像头显示在图片控件Picture Control

    vs2015 + opencv3.3 + mfc读取摄像头显示在图片控件Picture Control 要开始做一个行人检测的小项目,首先读取出摄像头显示,参考了这位博主的教程:http : //bl ...

  3. QT编写实现图片的幻灯片播放、自适应显示、缩放(以鼠标位置为中心进行缩放)、拖动、重置、显示鼠标位置像素坐标及RGB值、播放GIF动画、截图保存、批量保存、拖入文件夹遍历所有文件

    这个图片查看器功能很多,是我花了不少心思,不断优化,不断添加功能的成果: 1.能打开并显示所有常用图片格式文件,显示鼠标位置像素坐标及RGB值 2.能缩放,拖动图片,可以以鼠标为中心滚动滚轮进行缩放 ...

  4. 利用opengl+MFC读取并显示文本与二进制格式的stl

    一. 配置opengl与vs2015 参考:https://blog.csdn.net/qq_24990189/article/details/89631111 二.所有代码: // OpenGLVi ...

  5. 详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示

    详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示 目录 01-详解函数imread():读取图像文件 02-详解函数imshow():显示图像 03-使用 ...

  6. OpenCV中读取、显示、保存图像及获取图像属性操作讲解及演示(附源码)

    需要源码和图片请点赞关注收藏后评论区留言私信~~~ OpenCV的作用在于让开发人员更容易地通过编码来处理图像.那么,处理图像需要执行哪些操作呢?图像处理的基本操作包含4个方面的内容:读取图像.显示图 ...

  7. 在MFC程序中显示 JPG/GIF图像

    如果你是一个使用VB编程的程序员,要在程序中显示JPG或者GIF图像简直易如反掌,将图像控件拖到Form中,分分钟即可搞掂.但是C++程序员要显  示同样的图形却没有那么轻松,那么是不是要自己编写JP ...

  8. 数字图像处理(极简) 第三章 BMP文件的读取与显示(docx)

    建议先修课程:高等数学(微积分).线性代数. 参考书目: 1.图像工程(上册)--图像处理(第4版) 章毓晋 清华大学出版社 链接:https://pan.baidu.com/s/1hEMGRUotQ ...

  9. [转载] OpenCV-Python 图像处理(二):图像的读取、显示与保存

    参考链接: Python OpenCV 基础 2 : imwrite 保存图像 说明: 本系列主要是学习OpenCV-Python文档的个人笔记.很少有理论的叙述,都是函数名.参数描述.作用.应用场景 ...

最新文章

  1. 开源生态也难逃“卡脖子”危机?中国AI开发者的警醒和突围
  2. 基于python的分类预测_机器学习算法(五): 基于支持向量机的分类预测
  3. 你的计算机无法启动一键还原,教你电脑怎么一键还原
  4. autoconf和automake的安装与使用
  5. Ubuntu 16.04.6 LTS 发布:紧急修复 APT 漏洞
  6. SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍
  7. Android点击返回键销毁自己,Activity界面销毁 软键盘未收回
  8. selenium 基本的键盘方法
  9. linux系统中用户和组的管理
  10. [python] 为 pip 更换国内源
  11. JVM学习笔记四_垃圾收集器与内存分配策略
  12. pycharm 安装JPype
  13. Duilib中caption的问题
  14. 添加CNZZ统计代码
  15. 独孤九剑之js操作数组
  16. 怎么看电脑的hdmi是输出还是输入_怎么看电脑显示器有没有hdmi接口
  17. 支持向量机中所谓的支持向量究竟是什么?
  18. 2012/5/9武汉佰钧成
  19. 3.7 矩阵最小二乘广义逆
  20. 华为任正非最新发声:活下来!

热门文章

  1. 模拟算法-桶排-信号塔问题详解+代码——zzx的博客
  2. R0~R16寄存器作用
  3. opencv关于对比度和亮度的误解
  4. ORA-00904标识符无效(太坑了!!)
  5. 在北京住着500多万的房子,却以捡破烂为生是什么样的体验?
  6. vue3 安装使用scss
  7. JAVA-生成质数表
  8. 征信修复?小心被“割韭菜”!
  9. blogger_如何使用Google Blogger创建博客
  10. 朝鲜APT组织Group123利用美朝会议消息构造恶意HWP文件针对韩国发起攻击