当前位置: 首页 > news >正文

打造一款离线可用的桌面 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

所有快捷键支持录制模式——点击输入框后按下你想设置的热键即可。

技术亮点总结

  1. 复用微信 OCR 引擎:直接调用微信官方 OCR 动态库,识别准确率高、完全离线、无需付费

  2. 双模式操作:GUI 和 HTTP API 并存,兼顾人工使用和程序集成

  3. 全局热键:系统级快捷键,操作流畅不中断工作流

  4. 完整的工程化设计:模块解耦、异步线程、设置持久化、状态反馈,不是玩具项目

  5. 跨架构兼容:同时支持 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 ⭐ 支持!

http://www.zskr.cn/news/1424659.html

相关文章:

  • 终末期心衰并非终局!合肥高心成功破局112kg超高危多病灶心衰患者
  • 宇视VMS-U停车场添加出入口相机配置指导
  • 想用ABIDE数据集做自闭症研究?这份保姆级数据获取与预处理指南请收好
  • 农业机器人多模态SLAM数据集Rosario v2技术解析
  • MySQL之表的内连接和外连接
  • 第17篇 Docker Compose 进阶实战:多 Compose 文件与环境覆盖
  • 别再重启电脑了!Windows 11下dwm.exe内存飙升,试试更新Intel核显驱动(附详细步骤)
  • 近数据处理架构的内存瓶颈与优化实践
  • 别再只盯着困惑度了!用Python实战LDA主题模型,手把手教你用主题一致性找到最佳主题数
  • 深圳正规移民公司有哪些?实力强资质齐全机构推荐清单
  • 【限时解密】Lindy 23.2+版本隐藏功能:动态租期重算引擎与IFRS 16/ASC 842双准则自动适配器(仅开放至Q3末)
  • 阿里巴巴与南京大学联手:给AI图像生成模型换上“智能神经网络“
  • Keil µVision中配置GNU GCC工具链的完整指南
  • 手把手教你“拆解”一个Linux驱动模块(.ko文件):从符号表、编译参数到依赖关系全解析
  • 新手避坑指南:Ubuntu换源后 apt update 还是慢?可能是这5个原因(附排查命令)
  • python学习——核心语法四
  • 零基础吃透「护网行动」!小白也能看懂的全网最细入门教程
  • 深入Linux内核:拆解ARM64架构下spinlock.h中WFE()与dsb_sev()的默契配合
  • 错误处理设计:Agent 调用工具失败怎么办
  • 用statsmodels做时间序列分解踩过的坑:period设错、趋势外推,我都帮你试过了
  • 抖音批量下载神器:告别手动保存,高效管理你的数字内容库
  • 告别手动配环境:用PyAutoFEP+Gromacs搞定FEP自由能计算(附完整配置文件)
  • 国内e型电子枪厂家性价比实测排行:新型e型电子枪/电子枪价格/电子枪改造/电子枪枪头/五家头部企业盘点 - 优质品牌商家
  • 2026 年一句话生成应用是真趋势,还是新一轮低代码包装?
  • BL51链接器CODE空间分段管理与内存布局优化
  • 矿山做业全域透明.风险清零透明化三维立体重构视频孪生数字孪生盲区管控
  • 基于Arduino与NRF24L01的手势控制无线小车设计与实现
  • 输入一句话,AI自动生成一条短视频:这个67K Star的开源项目让剪辑师开始慌了
  • KMS_VL_ALL_AIO:如何实现Windows和Office的智能永久激活?
  • 精准环评实战、破解地下水污染预测难题:Visual MODFLOW Flex建模与案例实操揭秘