以下文章来源于aardio ,作者Jacen He
桌面软件快速开发工具。小轻快,永久免费。丰富的开源库,兼容大量第三方语言
先声明一下:
本文提供的代码是为了学习与研究编程技术,勿作其他任何不当用途。
今天偶然在 GitHub 看到一个不错的开源项目:
C++ 版: github.com/EEEEhex/QQImpl
Python 版: github.com/kanadeblisst00/wechat_ocr
可以调用微信 OCR 。
于是用纯 aardio 代码翻译了一下创建了 process.wxOcr 扩展库。扩展库源码的一些技术要点我都写了注释,大家可以看看。
用法很简单。
我们只要下载几 MB 的极简开发环境 aardio 。
新建工程,复制下面的代码粘贴到 main.aardio :
//创建窗口
import win.ui;
var winform = win.form(text="测试 OCR")
winform.add(
edit={cls="edit";marginLeft=1;marginTop=1;marginRight=1;marginBottom=1;multiline=1}
)
//导入 OCR 扩展库
import process.wxOcr;
//创建 OCR 对象
var ocr = process.wxOcr();
//识别文本
ocr.sendRquest("D:\testocr.jpg",
//最后一个参数指定一个函数异步接收识别结果
function(mmojoOcrResponse){
//识别结果
var result = mmojoOcrResponse.ocrResult.singleResult;
//逐行输出文本
for(k,line in result){
winform.edit.print(line.singleStrUtf8)
}
}
)
//显示窗口
winform.show();
win.loopMessage();
点击『保存 Ctrl +S』按钮:
按『运行 F5 』按钮看效果,按 F7 一键生成独立 EXE 文件。
下面再增加一点难度。
添加一个截屏选区转文本的功能:
import win.ui;
/*DSG{{*/
var winform = win.form(text="调用微信 OCR";left=-2;top=-2;right=323;bottom=382;topmost=1)
winform.add(
btnOcr={cls="button";text="提取图像文本";left=150;top=341;right=308;bottom=376;db=1;dl=1;dr=1;z=2};
edit={cls="edit";left=9;top=6;right=314;bottom=335;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=1}
)
/*}}*/
import process.wxOcr;
var ocr = process.wxOcr();
if(!ocr) error("系统未安装微信");
//按钮事件
winform.btnOcr.oncommand = function(id,event){
//屏幕选区
import mouse.screenArea;
var screenArea = mouse.screenArea();
//保存屏幕选区
screenArea.onSelectionChanged = function(rc){
import gdip.snap;
var bmp = gdip.snap(screenArea.hwnd,rc.xywh());
bmp.save("/~~~~ocr.jpg",80);
owner.close();
}
screenArea.doModal();
//识别文本
ocr.sendRquest("/~~~~ocr.jpg",
function(mmojoOcrResponse){
//识别结果
var singleResult = mmojoOcrResponse.ocrResult.singleResult;
//逐行输出到文本框
for(k,ret in singleResult){
winform.edit.print(ret.singleStrUtf8)
}
}
)
}
//显示窗口
winform.show();
win.loopMessage();
运行效果如下:
注意识别结果里的 mmojoOcrResponse 是一个 protobuf.message 对象,aardio 里的 protobuf 消息对象是直接兼容 JSON 的,不需要写任何代码,可以直接用下面的代码转换为 JSON 。
web.json.stringify(mmojoOcrResponse)
或者用下面的代码转换为纯表对象:
web.json.strip(mmojoOcrResponse)
当然,直接用 mmojoOcrResponse 也很方便。
其实 aardio 中提供了不少 OCR 的扩展库,例如: string.ocrLite, dotNet.ocr ,tesseract 等等。利用 aardio 提供的 web.rest 调用各种在线 OCR 接口也很方便,基本不需要额外去封装扩展库。