打造一款离线可用的桌面 OCR 工具:微信 OCR 引擎复用实践
前言在日常工作中我们经常会遇到需要提取屏幕或图片中文字的场景——比如识别截图中的代码片段、从 PDF 扫描件中复制文字、或者从无法直接复制的文档中提取信息。市面上虽然有很多 OCR 工具但大多存在以下痛点在线 API需要联网、有调用次数限制、涉及隐私风险开源方案如 Tesseract识别准确率有限中文支持不够好专业软件功能臃肿、价格昂贵那有没有一种方案既能离线使用又能保证识别准确率而且轻量免费答案是复用微信的 OCR 引擎。微信作为国民级应用其内置的 OCR 能力经过海量用户场景的验证扫码、翻译、提取图片文字等识别准确率相当出色。而且它的 OCR 动态库mmmojo.dll是可以直接调用的。基于这个思路我开发了一款桌面 OCR 工具——WxOcrTool本文将分享它的技术实现和核心设计。项目概览WxOcrTool 是一款基于微信 OCR 引擎的 Windows 桌面端文字识别工具提供截图识别和本地图片识别两种核心能力同时暴露HTTP API方便其他程序集成。项目地址[https://github.com/branden9839/wxOcr] | 技术栈Python wxPython Flask核心能力| 功能 | 说明 ||------|------|| 截图识别 | 框选屏幕任意区域自动识别文字 || 图片识别 | 打开本地 JPG/PNG/BMP 图片进行识别 || HTTP API | 提供 RESTful 接口供自动化脚本集成 || 全局热键 | 系统级快捷键窗口不在前台也能触发 || 系统托盘 | 最小化到托盘后台常驻运行 || 开机自启 | 通过 Windows 注册表实现自启动 |技术架构整个项目采用模块化设计各模块各司其职┌─────────────────────────────────────┐ │ GUI (wxPython) │ │ 主窗口 / 截图界面 / 设置对话框 │ └────────────┬────────────────────────┘ │ ┌────────────▼────────────────────────┐ │ OCR 引擎 (ocr.py) │ │ 初始化微信 OcrManager → 提交识别任务 │ │ → 回调获取结果 │ └────────────┬────────────────────────┘ │ ┌────────────▼────────────────────────┐ │ 微信 OCR 动态库 (mmmojo.dll) │ │ ocrTx/ 模型文件 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ HTTP 服务 (Flask) │ │ localhost:5000 │ │ GET /screenshot GET /status │ └─────────────────────────────────────┘各模块职责| 模块 | 文件 | 职责 ||------|------|------|| 主入口 |main.py| 启动 GUI Flask 服务 || GUI 层 |view.py| 主窗口、工具栏、菜单、托盘、状态提示 || 设置管理 |settings_dialog.py| 配置项持久化settings.json || OCR 服务 |ocr.py| 封装微信 OCR 引擎调用 || 截图模块 |shot.py| 全屏遮罩 鼠标拖拽选取区域 || HTTP 服务 |server.py| Flask REST API || OCR 线程 |ocrThread.py| 异步执行 OCR不阻塞 GUI |核心技术实现1. 微信 OCR 引擎的调用这是项目的核心亮点。微信的 OCR 能力封装在mmmojo.dll或 64 位版本mmmojo_64.dll中通过 COM 接口暴露。调用流程如下classOCRService:definitialize_ocr_manager(self):# 初始化 OcrManager 对象self.ocr_managerwin32com.client.Dispatch(OcrManager)# 启动 OCR 引擎self.ocr_manager.InitOcrEngine()defprocess_ocr(self,img_path):# 设置回调self.ocr_manager.OnOcrResultself.ocr_result_callback# 设置超时self.ocr_manager.SetTimeOut(30000)# 提交识别任务self.ocr_manager.OCR(img_path,zh)defocr_result_callback(self,result):# 解析 OCR 结果提取文字# 通过 wx.CallAfter 更新 GUI线程安全...关键点使用win32com.client.Dispatch创建 COM 对象通过OnOcrResult回调接收识别结果引擎数据模型文件位于ocrTx/目录下同时携带 32 位和 64 位两种 DLL兼容不同系统架构2. 截图功能的实现截图功能是全屏覆盖 鼠标拖拽选取的经典模式classScreenshotFrame(wx.Frame):def__init__(self):# 全屏无边框窗口半透明遮罩self.ShowFullScreen(True)self.SetTransparent(100)defon_paint(self,event):# 绘制遮罩和选取区域# 选取区域用白色高亮显示defon_mouse_drag(self,event):# 记录起始位置和结束位置# 实时绘制选取矩形搭配keyboard库实现的全局热键默认CtrlQ无论窗口是否在前台都能一键唤起截图。3. 双模式交互设计既提供桌面 GUI又提供 HTTP API这是本工具的一大特色GUI 模式适合日常交互使用工具栏按钮截图识别、选择图片左右分栏左侧图片预览右侧结果显示系统托盘后台常驻随时唤出API 模式适合自动化集成# 触发截图识别会弹出截图界面curlhttp://localhost:5000/screenshot# 查询服务状态curlhttp://localhost:5000/status# 返回: {code: 200, message: 服务运行中, success: true, data: {...}}这种设计让工具不仅能手动使用还能嵌入到其他自动化工作流中。4. 用户体验细节工具在用户体验上做了不少打磨自动复制识别结果自动写入剪贴板自动保存可设置自动保存识别结果到文件状态提示右下角浮动弹窗显示识别进度和结果绿色成功、红色失败快捷键自定义支持任意组合键录制设置持久化所有配置保存到settings.json配置与个性化设置界面采用选项卡式布局包含两类配置常规设置自动复制到剪贴板自动保存结果到文件显示 OCR 状态提示最小化到系统托盘开机自启动快捷键设置截图识别默认CtrlQ打开图片默认CtrlO打开设置默认CtrlP所有快捷键支持录制模式——点击输入框后按下你想设置的热键即可。技术亮点总结复用微信 OCR 引擎直接调用微信官方 OCR 动态库识别准确率高、完全离线、无需付费双模式操作GUI 和 HTTP API 并存兼顾人工使用和程序集成全局热键系统级快捷键操作流畅不中断工作流完整的工程化设计模块解耦、异步线程、设置持久化、状态反馈不是玩具项目跨架构兼容同时支持 32 位和 64 位系统快速上手# 1. 克隆项目gitclone https://github.com/your-username/wxOcr.gitcdwxOcr# 2. 安装依赖pipinstall-rrequirements.txt# 3. 运行python main.py依赖清单wxPython4.2.0 Flask2.0.0 keyboard0.13.5 Pillow9.0.0 python-dotenv0.19.0 requests2.26.0适用场景程序员快速识别截图中的错误信息、代码片段办公人员从 PDF 扫描件、图片文档中提取文字研究人员收集资料时快速提取不可复制的文字内容自动化测试通过 HTTP API 集成到自动化流程中总结WxOcrTool 是一个站在巨人肩膀上的实践——通过复用微信成熟稳定的 OCR 引擎能力我们可以在不依赖任何云服务的情况下获得高质量的离线文字识别体验。项目的核心价值在于技术可行微信 OCR 引擎确实可以独立调用体验完善从截图到识别到结果处理全链路流畅集成友好HTTP API 让它能融入更复杂的自动化体系如果你也有类似的需求不妨 Clone 下来试一试或者基于这个思路开发你自己的工具。如果你觉得这个项目对你有帮助欢迎 Star ⭐ 支持