javascript - 将缓冲区作为 Uint8Array 传递,不带空字节
问题描述
我正在尝试通过缓冲区将图像数据从Jimp图像对象传递到 Tesserract (ocr lib):
image.getBufferAsync('image/png').then((buffer) => {
// Buffer here is <Buffer 12 34 56 ...
const worker = new TesseractWorker();
worker.recognize(buffer)
.then((result) => { console.log('result', result.text); });
});
从 Teseract 抛出一个错误,说它想要 Uint8Array 而不是缓冲区
TypeError [ERR_INVALID_ARG_VALUE]: The argument 'path' must be a string or Uint8Array without null bytes. Received <Buffer 89 50 4e 47...
所以我尝试将缓冲区转换为 Uint8Array:
buffer = new Uint8Array(buffer);
但我得到另一个错误:
TypeError [ERR_INVALID_ARG_VALUE]: The argument 'path' must be a string or Uint8Array without null bytes. Received Uint8Array [
137,
80,
...
哪里有错?
如果我将图像文件保存到光盘然后通过 Teseract 读取它的路径 - 它可以工作,所以问题不应该是图像。
解决方案
文档指出,在 Node JS 中,img
参数应该是本地图像的路径。
在浏览器上,图像可以是:
- 图像、视频或画布元素
- 一个 File 对象(来自一个文件)
- 可访问图像的路径或 URL
在 Node.js 中,图像可以是
- 本地图像的路径
https://github.com/naptha/tesseract.js/blob/master/docs/image-format.md
这意味着库希望自己读取文件,而不是提供字节流进行分析。
推荐阅读
- laravel - Laravel 站点在重新安装供应商后停止工作
- java - 使用 javaMail 在 Java 11 中发送电子邮件时出错 - java.lang.module.ResolutionException:
- sql-server - 选择以逗号分隔的摘要计数?
- sql-server - ADO 不传递第一个参数值
- fabricjs - Fabricjs - 仅通过边框选择
- r - 如果文本包含 r 中的特定字符,则替换为新字符串
- python - 在 Python 中创建条件函数
- firebase - 从 Firebase 客户端库获取 Firestore 使用情况统计信息
- eclipse - 在 Eclipse 中更新父 Maven 项目
- c# - 绑定到 Heroku 动态 $PORT 并不断出错?