App Inventor 2 OCR 自研拓展:离线图片文字识别(Tesseract 5)

« 返回首页

拓展下载

  • .aix 最新拓展下载:

    cn.fun123.OCR.aix - v2.0

    • 内置简体中文 chi_sim 轻量模型,安装后即可离线识别

注:本拓展包含原生库(.so),联机调试需 2026-07 之后的新版 AI 伴侣;打包 APK 不受影响,详见 常见问题

简介

OCR(Optical Character Recognition,光学字符识别)拓展把 Tesseract 5 引擎带进 App Inventor:给一张图片,把图里的文字认出来变成文本。完全离线——不需要 API Key、不联网、不产生任何费用,识别在手机本地完成。

三种图片来源都支持:

来源 方法
图片文件(素材名 / 设备路径) RecognizeImageFile
界面上的图像组件 RecognizeImageComponent
Base64 编码的图片数据 RecognizeBase64

典型场景:拍答题卡取题、识别商品标签、从截图里抽文字、无障碍朗读前取词等。

技术原理与内部框架

拓展采用“输入适配 → 后台识别 → 事件回传”的处理框架:

  1. 模型管理Init 首次运行时把语言模型释放到应用私有目录,并创建 Tesseract 识别实例;更换 Language 后可加载应用素材中的其它语言模型。
  2. 输入适配:文件路径、图像组件和 Base64 数据都会先统一解码为 Android Bitmap,再交给识别层处理。
  3. 任务调度:初始化和识别任务在单线程后台队列中顺序执行,避免阻塞界面;ReadyBusy 用于暴露当前状态并防止任务重入。
  4. 文字识别:底层通过 Tesseract 5 与 Leptonica 分析图像,使用 .traineddata 语言模型输出 UTF-8 文本。
  5. 结果回传:识别完成后切回界面线程,通过 InitializedGotTextErrorOccurred 事件把状态、文本或错误信息交给 App Inventor 积木。

快速上手

调用顺序固定三步:Init 初始化引擎 → 等 Initialized 事件 → 再调识别方法、在 GotText 里拿结果。识别是异步的,调完方法就返回,结果通过事件送回来。

属性

Language
识别语言,对应 tessdata 里的模型名,默认 chi_sim(简体中文)。要用其它语言,把对应的 .traineddata 加进应用素材,再把本属性设成它的文件名(不含扩展名)。
Ready
引擎是否已就绪(Init 成功后为真)。只读。
Busy
是否正在识别中;识别期间再次调用识别方法会被忽略并触发 ErrorOccurred。只读。

事件

Initialized(success,message)
初始化完成时触发;success 为真表示引擎已就绪。
GotText(text)
识别成功时触发,text 为识别出的文字。
ErrorOccurred(message)
出错时触发。

方法

Init()
初始化识别引擎(首次会把模型解到应用私有目录)。异步执行,完成后触发 Initialized 事件。
RecognizeImageFile(path)
识别图片文件里的文字。路径可以是素材名、/sdcard 路径或 file:// 地址。异步执行,成功后触发 GotText 事件。
RecognizeImageComponent(imageComponent)
识别图像组件当前显示图片里的文字。
RecognizeBase64(base64)
识别 Base64 编码图片里的文字(可带 data:image/…;base64, 前缀)。
Release()
释放引擎占用的内存;之后需要重新 Init。

使用示例

一个最小的可运行流程:进屏幕就初始化引擎,点按钮识别图像组件里的图片,结果写进标签。组件:图像1(图像)、按钮1(按钮)、标签1(标签)、OCR1(本拓展,非可视)。

when Screen1.Initialize {
  OCR1.Init();
}

when OCR1.Initialized(success, message) {
  if (success) {
    标签1.Text = "OCR 就绪,点按钮开始识别";
  } else {
    标签1.Text = "初始化失败:" + message;
  }
}

when 按钮1.Click {
  OCR1.RecognizeImageComponent(图像1);
}

when OCR1.GotText(text) {
  标签1.Text = text;
}

识别 Base64 图片(比如从摄像头、网络组件拿到的数据):

when OCR1.GotText(text) {
  标签1.Text = text;
}
when OCR1.ErrorOccurred(message) {
  标签1.Text = "识别失败:" + message;
}

procedure 识别Base64(数据) {
  if (OCR1.Ready) {
    OCR1.RecognizeBase64(数据);
  } else {
    标签1.Text = "请先初始化 OCR";
  }
}

常见问题

Q:联机调试有什么版本要求?

A:本拓展带原生库,需要使用 2026-07 之后的新版 AI 伴侣;打包 APK 不受影响。


Q:识别准确率不高,怎么调?

A:fast 模型追求速度与体积,准确率略低于标准模型。想换标准模型:从 tessdata 下载对应语言的 .traineddata(约 40MB)加进应用素材,Language 属性保持模型名不变即可(首次 Init 会从素材解出覆盖内置 fast 模型需要自行保证素材名与 Language 一致)。同时尽量提供清晰、端正、对比度高的图片,识别率会有明显提升。


Q:支持英文或其它语言吗?

A:支持。把对应语言的 .traineddata 加进应用素材,Language 设成模型名(如 eng)即可。拓展内置的只有 chi_sim


Q:能识别手写字吗?

A:Tesseract 对印刷体效果最好,手写体识别率有限,不建议依赖。

文档反馈