MLKitTextRecognizer 拓展:离线图片文字识别(OCR,中英文)

« 返回首页

logo 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 没有的语种。

文档反馈