MLKitTextRecognizer 拓展
识别图片里的文字(OCR),支持 拉丁字母与中文两种脚本。
为什么选它:
- 完全离线。识别模型随
.aix打包,设备不需要安装 Google Play 服务,断网也能用 —— 这对国内设备很关键。 - 两种脚本:拉丁字母(英文/法文/西文等)、中文(简繁都能认,也能认其中夹杂的拉丁字母)。
- 不用先”初始化”,切换脚本只改一个属性。
- 结果除全文外,还给出文字块 / 行 / 单词三级结构和每一级的坐标框,可以用来做文字定位、划词、局部高亮。
与本仓库
OCR拓展(Tesseract)的区别:本拓展用 Google ML Kit,中文识别准确率通常明显更好、 速度更快,但体积更大(约 15MB,离线模型打包在内)。
- .aix 拓展下载:
cn.fun123.MLKit.TextRecognizer.aix
快速上手
一、识别中文(最常用)
设计器里放一个 MLKitTextRecognizer,把 识别脚本 属性设成 chinese,再放一个「图像选择器」和一个标签。
when Screen1.Initialize() {
TextRecognizer1.Script = "chinese"
}
when 图像选择器1.AfterPicking() {
标签1.Text = "识别中…"
TextRecognizer1.RecognizeFromFile(图像选择器1.Selection)
}
when TextRecognizer1.RecognitionSuccess(text, resultJson) {
标签1.Text = text
}
when TextRecognizer1.RecognitionFailed(operation, errorMessage) {
标签1.Text = errorMessage
}
chinese脚本同时能认中文和其中夹杂的拉丁字母,所以中英混排的图片直接用chinese就行。
二、切换脚本
when 按钮_英文.Click() {
TextRecognizer1.Script = "latin"
标签_当前模式.Text = "当前:拉丁字母"
}
when 按钮_日文.Click() {
TextRecognizer1.Script = "chinese"
标签_当前模式.Text = "当前:中文"
}
when 按钮_韩文.Click() {
TextRecognizer1.Script = "latin"
标签_当前模式.Text = "当前:拉丁字母"
}
三、识别 Base64 图片
when 按钮_Base64.Click() {
TextRecognizer1.RecognizeFromBase64(文本输入框_Base64.Text)
}
四、拿结构化结果(做文字定位)
when TextRecognizer1.RecognitionSuccess(text, resultJson) {
标签1.Text = text
标签_原始结果.Text = resultJson
}
resultJson 的形状(用「JSON 文本解码」块解析):
{"text":"全文",
"blockCount":2,
"script":"chinese",
"blocks":[{"text":"这一块的文字",
"bounds":{"left":10,"top":20,"right":300,"bottom":80},
"cornerPoints":[{"x":10,"y":20}],
"lines":[{"text":"这一行",
"bounds":{"left":10,"top":20,"right":300,"bottom":50},
"elements":[{"text":"这","bounds":{"left":10,"top":20,"right":40,"bottom":50}}]}]}]}
三级结构:块(blocks)→ 行(lines)→ 单词/字(elements),每级都有 bounds 坐标框(原图像素)。
属性
- Script
- 识别脚本,决定用哪套模型。默认
latin。值 含义 latin拉丁字母:英文、法文、西班牙文、德文等(默认) chinese中文,简体繁体都能认,也能认其中夹杂的拉丁字母 填了认不出的值会回退到
latin(不会报错)。 - Busy
- 只读。是否正在识别。识别期间再次调用会触发
RecognitionFailed。
事件
- RecognitionSuccess(text,resultJson)
- 识别成功。
text是全文(只想显示文字用这个就够了);resultJson是含文字块/行/单词三级结构和坐标的完整结果(见示例四)。 图片里没有文字时text为空串。 - RecognitionFailed(operation,errorMessage)
- 识别失败。
operation是出错的方法名。
方法
- RecognizeFromFile(path)
- 识别图片文件中的文字。
path可以是素材文件名、设备路径、file://或content://地址 (「图像选择器」的选中项可以直接传进来)。 - RecognizeFromBase64(base64)
- 识别 Base64 图片中的文字。支持纯 Base64,也支持带
data:image/...;base64,前缀的写法。
运行环境:AI 伴侣联机需要 Android 11 及以上
本拓展的识别模型放在依赖库自带的 assets 里,AI 伴侣联机调试要把它挂进
AssetManager,用的是 Android 11(API 30)才有的 ResourcesLoader —— 这是系统提供的
唯一公开办法,更低版本没有等价 API。所以:
| 运行方式 | Android 6 ~ 10 | Android 11 及以上 |
|---|---|---|
| 打包 APK | ✅ 正常 | ✅ 正常 |
| AI 伴侣联机 | ❌ 模型加载不了 | ✅ 正常 |
打包 APK 之所以不受限制,是因为模型在编译时就被并进了 APK 的 assets,装到手机上 就是 App 自己的资源,与系统版本无关。伴侣的 APK 是提前编好装在手机上的,运行时没法 往自己已安装的包里加文件,只能靠系统的运行时挂载 API。
低版本设备上想验证功能,直接打包 APK 测即可;要用伴侣边改边调,请换 Android 11+ 的设备。
常见问题
中文识别不出来 / 全是乱码。
识别脚本 还是默认的 latin。中文必须设成 chinese。
识别率不高。
按影响大小排查:① 图片太小/太模糊 —— 文字高度建议至少 16 像素;
② 拍歪了 —— ML Kit 能容忍小角度倾斜,但大幅透视变形要先纠正(可以先用 MLKit.DocScanner 扫描纠正再识别);
③ 光照不均、有阴影;④ 艺术字/手写体 —— 手写请用 MLKit.Handwriting(那是笔迹识别,不是 OCR)。
能识别一张图里的多种语言吗?
chinese 能同时认中文和拉丁字母,所以中英混排一个脚本就够。
为什么 .aix 有 15 MB?
拉丁与中文两套离线模型 + 推理引擎都打包在里面了。这是「完全离线、不依赖 Google Play 服务」的代价。
(2026-08-02 起只保留中英文,去掉了日文/韩文/天城文三套模型,体积从约 30MB 降到约 15MB。)
和 OCR 拓展该用哪个?
中文场景建议本拓展(准确率和速度都更好)。OCR(Tesseract)的优势是可以换任意语言的
traineddata 模型文件、以及支持 ML Kit 没有的语种。
扫码添加客服咨询