打造一款离线可用的桌面 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_manager=win32com.client.Dispatch('OcrManager')# 启动 OCR 引擎self.ocr_manager.InitOcrEngine()defprocess_ocr(self,img_path):# 设置回调self.ocr_manager.OnOcrResult=self.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库实现的全局热键(默认Ctrl+Q),无论窗口是否在前台,都能一键唤起截图。
3. 双模式交互设计
既提供桌面 GUI,又提供 HTTP API,这是本工具的一大特色:
GUI 模式:适合日常交互使用
工具栏按钮:截图识别、选择图片
左右分栏:左侧图片预览,右侧结果显示
系统托盘:后台常驻,随时唤出
API 模式:适合自动化集成
# 触发截图识别(会弹出截图界面)curlhttp://localhost:5000/screenshot# 查询服务状态curlhttp://localhost:5000/status# 返回: {"code": 200, "message": "服务运行中", "success": true, "data": {...}}这种设计让工具不仅能手动使用,还能嵌入到其他自动化工作流中。
4. 用户体验细节
工具在用户体验上做了不少打磨:
自动复制:识别结果自动写入剪贴板
自动保存:可设置自动保存识别结果到文件
状态提示:右下角浮动弹窗,显示识别进度和结果(绿色成功、红色失败)
快捷键自定义:支持任意组合键录制
设置持久化:所有配置保存到
settings.json
配置与个性化
设置界面采用选项卡式布局,包含两类配置:
常规设置
自动复制到剪贴板
自动保存结果到文件
显示 OCR 状态提示
最小化到系统托盘
开机自启动
快捷键设置
截图识别(默认
Ctrl+Q)打开图片(默认
Ctrl+O)打开设置(默认
Ctrl+P)
所有快捷键支持录制模式——点击输入框后按下你想设置的热键即可。
技术亮点总结
复用微信 OCR 引擎:直接调用微信官方 OCR 动态库,识别准确率高、完全离线、无需付费
双模式操作:GUI 和 HTTP API 并存,兼顾人工使用和程序集成
全局热键:系统级快捷键,操作流畅不中断工作流
完整的工程化设计:模块解耦、异步线程、设置持久化、状态反馈,不是玩具项目
跨架构兼容:同时支持 32 位和 64 位系统
快速上手
# 1. 克隆项目gitclone https://github.com/your-username/wxOcr.gitcdwxOcr# 2. 安装依赖pipinstall-rrequirements.txt# 3. 运行python main.py依赖清单:
wxPython>=4.2.0 Flask>=2.0.0 keyboard>=0.13.5 Pillow>=9.0.0 python-dotenv>=0.19.0 requests>=2.26.0适用场景
程序员:快速识别截图中的错误信息、代码片段
办公人员:从 PDF 扫描件、图片文档中提取文字
研究人员:收集资料时快速提取不可复制的文字内容
自动化测试:通过 HTTP API 集成到自动化流程中
总结
WxOcrTool 是一个"站在巨人肩膀上"的实践——通过复用微信成熟稳定的 OCR 引擎能力,我们可以在不依赖任何云服务的情况下,获得高质量的离线文字识别体验。
项目的核心价值在于:
技术可行:微信 OCR 引擎确实可以独立调用
体验完善:从截图到识别到结果处理,全链路流畅
集成友好:HTTP API 让它能融入更复杂的自动化体系
如果你也有类似的需求,不妨 Clone 下来试一试,或者基于这个思路开发你自己的工具。
如果你觉得这个项目对你有帮助,欢迎 Star ⭐ 支持!
