记录使用 MFC 打开文件对话框读取一张图片并做简单的灰度转换算法简单学习过程
由于刚开始接触MFC做一个简单的图片读取并且转成灰度图同时进行边缘检测任务后续可能在此基础上在进行改进我目前做的是直接用代码生成一个对话框不是在资源里面添加对话框一、创建VS程序首先创建一个文件打开事件处理程序这样就可以使用文件下面的打开按钮打开一张自己想要的图片在资源文件中右键查看.rc代码右键双击打开→添加事件处理程序→选择View接下来就可以在这里面操作了首先我随便响应了一个AfxMessageBox消息框来验证是否成功在这里还需要将字符集改成多字节字符集右键→属性→高级自己的想法在做一些简单的图像算法处理的时候我将对话框和图像算法的代码都放在imageshowView.cpp里面进行操作这样操作不好的一个地方是所有代码都在同一个地方非常乱不方便后续操作因此在这个基础上进行了改进对话框和图像算法都单独作为.cpp来进行创建然后再在imageshowView.cpp进行调用展示即可。补充一下自己的做法这种做法感觉有点复杂void CimageshowView::OnDraw(CDC* pDC) { CimageshowDoc* pDoc GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; if (0 s_fOpenFile) { return; } BITMAPINFO bmi; memset(bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth img_w; bmi.bmiHeader.biHeight img_h; bmi.bmiHeader.biPlanes 1; bmi.bmiHeader.biBitCount 24; bmi.bmiHeader.biCompression BI_RGB; SetDIBitsToDevice( pDC-m_hDC, 0, 0, img_w, img_h, 0, 0, 0, img_h, img_rgb, bmi, DIB_RGB_COLORS); } void RgbToYuv(int w, int h, BYTE* imgRGB1, BYTE* imgGray1) { BYTE* pSrc imgRGB1; BYTE* pDst imgGray1; for (int y 0; y h; y) { for (int x 0; x w; x) { int B pSrc[0]; int G pSrc[1]; int R pSrc[2]; int Y (int)(0.299 * R 0.587 * G 0.114 * B); pDst[0] Y; pDst[1] Y; pDst[2] Y; pSrc 3; pDst 3; } } } void EdgeDetect(SIZE sz, PBYTE pSrcGray, PBYTE pDstGray) { ASSERT(pSrcGray); ASSERT(pDstGray); int w sz.cx; int h sz.cy; /*memset(pDstGray, 0, w * h);*/ for (int y 1; y h - 1; y) { for (int x 1; x w - 1; x) { int v00 pSrcGray[(y - 1) * w (x - 1)]; int v01 pSrcGray[(y - 1) * w x]; int v02 pSrcGray[(y - 1) * w (x 1)]; int v10 pSrcGray[y * w (x - 1)]; int v11 pSrcGray[y * w x]; int v12 pSrcGray[y * w (x 1)]; int v20 pSrcGray[(y 1) * w (x - 1)]; int v21 pSrcGray[(y 1) * w x]; int v22 pSrcGray[(y 1) * w (x 1)]; int g 4 * v11 - v01 - v10 - v12 - v21; if (g 0) g -g; if (g 255) g 255; pDstGray[y * w x] (BYTE)g; } } } void ShowEdgeImage(PSTR lpszTitle, SIZE sz, PBYTE pRGB) { ASSERT(pRGB); int w sz.cx; int h sz.cy; int img_size w * h; ASSERT(w IMG_MAX_WIDTH h IMG_MAX_HEIGTH img_size IMG_MAX_SIZE); static BYTE s_pGray[IMG_MAX_SIZE]; static BYTE s_pEdge[IMG_MAX_SIZE]; static BYTE s_pEdgeRGB[IMG_MAX_SIZE * 3]; PBYTE pGray s_pGray; PBYTE pEdge s_pEdge; RgbToYuv(w, h, pRGB, s_pEdgeRGB); for (int i 0; i img_size; i) { pGray[i] s_pEdgeRGB[i * 3]; } EdgeDetect(sz, pGray, pEdge); for (int i 0; i img_size; i) { BYTE e pEdge[i]; s_pEdgeRGB[i * 3 0] e; s_pEdgeRGB[i * 3 1] e; s_pEdgeRGB[i * 3 2] e; } CImageDlg dlg(AfxGetMainWnd(), lpszTitle, sz, s_pEdgeRGB, 24); dlg.DoModal(); }对上述进行了改进二、将一幅彩色图像转换为灰度图像并显示1、单独创建一个对话框用来显示各种图片imgdlg.cpp和imgdlg.h.cppCImageDlg::CImageDlg(CWnd* pParent, PSTR lpszTitle, SIZE sz, PBYTE pImg, int nBPP) : CDialog() { m_pWndFocus GetFocus(); // 保存当前焦点窗口关闭时还原 int cbBytes sizeof(DLGTEMPLATE) 4096; // 在内存中构造一个对话框模板 m_hdt GlobalAlloc(GMEM_FIXED, cbBytes); // GMEM_FIXED分配固定地址内存 DLGTEMPLATE* pdt (DLGTEMPLATE*)GlobalLock(m_hdt); // 锁定内存并获得可写指针 memset(pdt, 0, cbBytes); pdt-style DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU; pdt-dwExtendedStyle 0; GlobalUnlock(m_hdt); strcpy_s(m_szTitle, lpszTitle); // 安全版本保存标题到成员变量 m_szImg sz; ASSERT(8 nBPP || 24 nBPP); m_nBPP nBPP; // 保存图像位深 int rgb_bytes sz.cx * sz.cy * 3; m_pRGB (PBYTE)malloc(rgb_bytes); ASSERT(m_pRGB); memcpy(m_pRGB, pImg, rgb_bytes); // 复制图像数据到成员缓冲区 BOOL code InitModalIndirect(m_hdt, pParent); // 初始化模态对话框 // 构造右键弹出菜单 m_menuCmd.CreatePopupMenu(); // 循环数组总字节数 / 单个元素字节数 元素个数 for (int i 0; i sizeof(menuid) / sizeof(menuid[0]); i) { PPOPUPMENUID lpmi menuid[i]; // 取得当前菜单项的指针 int flag MF_BYPOSITION | lpmi-nFlag; // 插入菜单项后面在OnRButtonDown里会被弹出显示 m_menuCmd.InsertMenu(0, flag, lpmi-idCmd, lpmi-lpszItem); } } CImageDlg::~CImageDlg() { if (m_pRGB) { free(m_pRGB); m_pRGB 0; } m_menuCmd.DestroyMenu(); if (m_hdt) { GlobalFree(m_hdt); } }2、简单的图像处理算法方案一单独创建RgbToYuv.cpp的代码如下.h我想的是直接在.cpp里面创建一个类来继承CImageDlg然后在view.cpp里面进行调用这样写出来又存在一个问题每次使用时都得写一个DoModal()来调用对话框而且前面我已经写了一个对话框来显示图片了所以这里就很多余我又进行了改进方案二RgbToYuv.cppRgbToYuv.hview.cpp这样写下来和方案一差不多每次都在调用方案三最佳RgbToYuv.cpp.hview.cpp这种方案就直接在view.cpp中调用RgbToYuv和ShowGrayImage函数来显示对话框里面的图像了就不用像之前两种方案里面那样每次都得调用一个对话框。运行结果如下总结在学习这个之前得先了解c和mfc的一些相关知识不然就会搞得很复杂没有逻辑。如果有更好的解决办法可以多多交流

相关新闻

2026年折叠电钢琴选购指南:4款特伦斯型号参数横评+场景化选型方案

2026年折叠电钢琴选购指南:4款特伦斯型号参数横评+场景化选型方案

作为一个有5年教学经验的钢琴老师,我之前对折叠电钢琴一直持保留态度——折叠结构会不会牺牲键盘手感?便携性是否以牺牲音质为代价?直到去年因为租房搬家,入手了一台特伦斯V70pro折叠电钢琴,用了半年之后,我…

2026/8/26 18:02:39 阅读更多 →
Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)

Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)

Vue Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2) 一、环境准备 服务器:Ubuntu Server 24.04.4 LTS 系统版本:RuoYi v3.9.2、Spring Boot 4.0.6、Vue 2 后端依赖:OpenJDK 17、Maven 3.0、MySQL 5.7…

2026/8/26 18:02:39 阅读更多 →
电商客服怎么导出微信与客户的聊天记录来进行高效管理?轻虾导出助手实战教程

电商客服怎么导出微信与客户的聊天记录来进行高效管理?轻虾导出助手实战教程

一、客服的日常:聊天记录乱成一团 小杨是一家电商公司的客服主管,团队 10 个客服,每天在微信上处理上百个客户咨询:订单查询、物流催促、退款申请、质量问题反馈……一年下来,客户聊天记录上万条,问题也随之…

2026/8/26 18:02:39 阅读更多 →

最新新闻

【快读系列】skill的方方面面

【快读系列】skill的方方面面

【快读系列】skill的方方面面概述skill的生命周期基于三个问题的探究这篇文章我们得到了什么剩下的一些疑问概述 本文是对《From Raw Experience to Skill Consumption: A Systematic Study of Model-Generated Agent Skills》的学习和整理。这篇文章是从skill相关的what层面出…

2026/8/26 19:16:14 阅读更多 →
第07篇-Session模型与记忆

第07篇-Session模型与记忆

【OpenClaw 从入门到精通】第 7 篇:Session 模型与记忆 本系列定位:零基础入门,从安装配置到高级架构全覆盖。无论你是开发者、运维工程师、还是技术爱好者,本系列带你彻底掌握 OpenClaw。 本篇你将学到 OpenClaw 的 Session 概念…

2026/8/26 19:16:14 阅读更多 →
门店导购 Agent 怎么做?装个可实时互动的 3D 身体,一键补齐自然交流界面

门店导购 Agent 怎么做?装个可实时互动的 3D 身体,一键补齐自然交流界面

我学了 3-4 年后端,去年开始转向 Agent 开发。做过基于 RAG 的问答机器人,也给聊天机器人接过各种模型能力,功能都能跑通,但每次给非技术背景的朋友演示,对方的反应都很一致:哦,一个聊天框。 这…

2026/8/26 19:16:14 阅读更多 →
短剧出海保留原声还是全量配音?两种声音策略怎么选

短剧出海保留原声还是全量配音?两种声音策略怎么选

短剧出海保留原声还是全量配音?两种声音策略怎么选 摘要: 保留原声加字幕和全量目标语配音,适合的市场、渠道与成本结构并不相同。本文比较两种声音策略在观看门槛、沉浸感、制作周期和审核难度上的差异,帮助团队选择合适的本地化…

2026/8/26 19:16:14 阅读更多 →
Python图论库NetworkX初步

Python图论库NetworkX初步

文章目录简介无向图基础图简介 NetworkX是 Python 生态中最著名、应用最广泛的图论与复杂网络分析开源库。它的核心使命是提供一套直观、灵活且功能全面的 API,用于创建、操作、分析和可视化复杂网络(图)的结构、动态与功能。 这个库十分著…

2026/8/26 19:15:13 阅读更多 →
文心导出word手机,AI导出鸭让AI导出回归优雅

文心导出word手机,AI导出鸭让AI导出回归优雅

文心导出word手机,AI导出鸭让AI导出回归优雅 通勤路上用文心一言生成了一份带表格的市场分析报告,到公司打开电脑准备导出Word时,却发现表格边框错乱、合并单元格分裂、公式变成了纯文本——这种场景,每个重度AI用户都不陌生。作为…

2026/8/26 19:15:13 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →