TextDetector.detect 是 Android Vision SDK 特有方法,无法在浏览器中使用;HTML 中应调用 OCR 云 API 或 WebAssembly 模型实现文字区域检测。

TextDetector 的 detect 方法不是 HTML 原生能力,它属于 Android 平台的 Vision SDK(如华为 ML Kit、阿里云 OCR SDK 或类似移动端 OCR 封装),**不能直接在纯 HTML/浏览器环境中调用**。浏览器里没有 Frame、VisionImage 或 TextConfiguration 这类 Android 特有类型,也没有 TextDetector(Context) 构造函数所需的 Context 实例。
你真正需要的,是区分清楚运行环境和对应技术路径。
为什么不能在 HTML 中直接 new TextDetector(this)
这个 this 指的是 Android Activity 或 Application 上下文 —— 浏览器中根本不存在;Frame 是 SDK 内部封装的图像容器,依赖 native 图像内存管理;detect() 返回的 JSONObject 也是 Java 层序列化结果,浏览器 JS 无法直接消费。试图在 HTML 中写 new TextDetector(this) 会立即报 ReferenceError: TextDetector is not defined 或 TypeError: Cannot read property 'detect' of undefined。
HTML 中等效替代:用 fetch 调 OCR 文本检测 API
前端能做的,是把图片上传给支持「仅检测不识别」的 OCR 接口,例如:
- Tencent Cloud 的
/ocr/text_detect(需传IsWords=false) - Google Vision API 的
TEXT_DETECTION请求,解析响应中除第一个textAnnotations[0]外的其余元素,它们带boundingPoly.vertices - 百度 OCR 的
general_basic接口加detect_direction=false参数(部分版本支持返回区域坐标)
关键步骤:
-
FileReader读取用户选的<input type="file">图片,转成base64或用FormData提交二进制 -
fetch发起 POST,注意设置Content-Type(base64 时用application/json,FormData 时让浏览器自动设multipart/form-data) - 响应体中找类似
data.blocks、textAnnotations[i].boundingPoly.vertices或words[].location这样的字段,每个顶点含x和y - 用这些坐标在 canvas 上画
rect或叠加 DOMdiv框定位文字区域
如果非要在浏览器跑检测模型:WebAssembly + OpenCV.js 或 ONNX Runtime
这条路可行但成本高,适合对隐私或离线有强要求的场景:
立即学习“前端免费学习笔记(深入)”;
- 用 OpenCV.js 加载预训练的 EAST 或 CRAFT 模型(.pb 或 .onnx 格式),需自己实现后处理(如 NMS、polygon 合并)
- 输入必须是
cv.Mat,得先用canvas.getContext('2d').getImageData()提取像素,再cv.matFromImageData() - 输出是浮点数组,要手动映射回 canvas 坐标系(注意 canvas 像素与图像原始尺寸缩放关系)
- 性能敏感:1080p 图在低端手机上可能卡顿,建议预缩放到 640px 宽再送检
典型错误是直接拿 measureText 或 getBoundingClientRect() 去“猜”文字位置 —— 它们只对已渲染文本有效,对截图、照片、PDF 渲染图完全无效。
容易被忽略的兼容性细节
OCR 接口返回的坐标系不统一:
- Tencent 返回的是相对于原图左上角的
{x, y},单位为像素 - Google Vision 的
vertices是按顺时针顺序的四点数组,但可能含0,0或负值(说明框跨边界) - 若图片被 CSS 缩放显示,而你用
canvas.width/height绘制,必须按比例换算坐标,否则框错位 - 部分接口对 PNG 透明通道处理异常,建议统一转 JPEG 提交
真正的文字检测永远始于图像像素,而不是 DOM 结构 —— 这一点,无论用 API 还是 WASM,都不能绕开。


















