文字识别(TextRecognizer)使用指导:拍照或选图,离线识别中英文

« 返回

机器学习套件(ML Kit)组件在在线版和教育版中提供,离线版(含机房版)不包含。

它能做什么

文字识别把图片里的文字读出来(OCR):支持拉丁字母(英文、法文、西班牙文等)、中文(简繁,也能认夹杂的英文)、日文、韩文和天城文(印地语、马拉地语、尼泊尔语等)五种脚本。识别在手机本地完成,不联网、不上传图片。结果除了全文,还给出「文字块 → 行 → 单词」三级结构和每一级的坐标框,可以用来做文字定位、只取某一块内容、在图上高亮等。

准备工作

  • 识别脚本:认中文选 chinese(中英混排也用它),只认英文选 latin(默认),日文、韩文、天城文分别选 japanese、korean、devanagari。五套模型都随 App 打包,不用联网下载。
  • 图片来源:素材文件名、「图像选择器」的选中项、「照相机」拍照返回的路径都可以直接传给「识别图片文件」。
  • 实时识别:在设计器里放一个垂直布局当「预览容器」,「打开实时摄像头」后对准文字就能读,不用先拍照。
  • 联机调试:安卓上用 AI 伴侣调试需要安装 MLKit 版 AI 伴侣(应用宝,包名 cn.fun123.appinventor);普通版伴侣不含识别引擎,调用时会触发「屏幕.出现错误时」(错误码 4722)。直接打包 APK 安装测试不受影响。
  • 安装包体积:只有用到本组件的 App 才会打包它的识别引擎与模型,体积以编译结果为准。
  • 鸿蒙:完整支持图片识别:调用系统文字识别,语种由系统决定(中英文为主),「识别脚本」只保存取值、不影响结果;实时摄像头识别暂不支持,「打开实时摄像头」会触发「识别失败」。

案例一:识别示例图、相册图片和拍照

界面放三个入口:识别示例图(工程自带 ocr_sample.png)、图像选择器、拍照按钮。三个入口都调同一个过程「开始识别」,识别前先看「正在识别」属性,避免连续点击时重复调用:

procedure 开始识别(路径) {
  图像_预览.Picture = 路径
  if 文字识别1.Busy {
    标签_状态.Text = "上一张还在识别,请稍等"
  } else {
    标签_状态.Text = "正在识别…"
    文字识别1.RecognizeFromFile(路径)
  }
}
when 按钮_示例图.Click() { 开始识别("ocr_sample.png") }
when 图像选择器_相册.AfterPicking() { 开始识别(图像选择器_相册.Selection) }
when 照相机1.AfterPicture(图像位址) { 开始识别(图像位址) }
when 文字识别1.RecognitionSuccess(文本, 结果JSON) {
  标签_全文.Text = 文本
}
when 文字识别1.RecognitionFailed(操作, 错误信息) {
  标签_错误.Text = join(操作, ":", 错误信息)
}

案例二:切换识别脚本并统计文字块和行数

下拉框选 chinese 或 latin 时同步改「识别脚本」。识别成功后用 Web 组件的「解码 JSON 为字典」解析结果,逐块累加行数,并取出第一块的坐标:

when 下拉框_脚本.AfterSelecting(选择项) {
  文字识别1.Script = 选择项
}
when 文字识别1.RecognitionSuccess(文本, 结果JSON) {
  var 结果 = Web客户端1.JsonTextDecodeWithDictionaries(结果JSON)
  var 文字块 = dictget(结果, "blocks", list())
  var 行数 = 0
  foreach 块 in 文字块 {
    行数 = 行数 + length(dictget(块, "lines", list()))
  }
  标签_详情.Text = join("共 ", length(文字块), " 个文字块、", 行数, " 行")
}

案例三:对准就读:实时识别文字

实时识别不用先拍照:放一个黑底垂直布局当预览区,「打开实时摄像头」后画面上框出每一行文字;「实时识别到文字」的参数与「识别成功」相同,按「实时事件间隔」(默认 200 毫秒)触发,里面只刷新标签:

when 按钮_实时.Click() {
  文字识别1.PreviewContainer = 垂直布局_预览
  文字识别1.StartLiveCamera()
}
when 按钮_停止.Click() { 文字识别1.StopLiveCamera() }
when 文字识别1.LiveText(文本, 结果JSON) {
  标签_状态.Text = choose(文本 == "", "画面里没有文字", "实时识别中")
  标签_全文.Text = 文本
}

结果数据说明

结果JSON 结构:{"text":"全文","blockCount":2,"script":"chinese","blocks":[{"text":"…","bounds":{"left":10,"top":20,"right":300,"bottom":80},"cornerPoints":[…],"lines":[{"text":"…","bounds":{…},"elements":[{"text":"…","bounds":{…}}]}]}]}。坐标是原图像素。图片里没有文字时「文本」为空。

常见问题

现象 原因与处理
中文识别出来是乱码或空 「识别脚本」还是 latin,中文必须设成 chinese
识别率不高 文字高度建议不小于 16 像素;避免大角度倾斜、阴影和反光;手写字请用「手写识别」
AI 伴侣里提示不含识别引擎 安装 MLKit 版 AI 伴侣,或打包 APK 测试
实时预览黑屏、看不到画面 「预览容器」要选布局组件并给明确宽高(如宽度充满、高度 300 像素);第一次打开要允许摄像头权限
实时检测时界面卡 调大「实时事件间隔」,事件里少做事;画面上的标注不受间隔影响

完整 .aia 源码与操作指导

下载 .aia 源码

导入 TextRecognizerDemo.aia 后可以直接打包 APK 运行;用 AI 伴侣联机调试请安装 MLKit 版 AI 伴侣。源码文件已通过正式编辑器载入、后台导入和 APK 编译校验;真机识别效果请以实际设备为准。

功能 操作 预期结果
识别示例图 点「识别示例图」 识别出工程自带图片里的中英文和电话号码
从相册选图 / 拍照 选一张有文字的图片,或拍一张 显示全文,详情区给出文字块数、行数和第一块坐标
切换识别脚本 下拉框改成 latin 后识别中文图 中文认不出,再切回 chinese 即可识别
日文 / 韩文 下拉框选 japanese 或 korean,识别对应文字的图片 识别出日文假名汉字或韩文
连续点击 识别尚未结束时再点 提示上一张还在识别,不会重复调用
实时识别 点「实时识别」,把摄像头对准书本或屏幕上的文字 预览区框出每一行文字,全文区实时刷新

案例界面与积木源码在仓库 docs/markdown/reference/components/guide/examples/TextRecognizerDemo/,SHA-256:b4651c08ddcce2524c24c056d924259c8f3de648b1bbdb439c10e741972666df。

文档反馈