首页 > 解决方案 > 将缓冲区作为 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 读取它的路径 - 它可以工作,所以问题不应该是图像。

标签: javascriptnode.jstesseract

解决方案


文档指出,在 Node JS 中,img参数应该是本地图像的路径。

在浏览器上,图像可以是:

  • 图像、视频或画布元素
  • 一个 File 对象(来自一个文件)
  • 可访问图像的路径或 URL

在 Node.js 中,图像可以是

  • 本地图像的路径

https://github.com/naptha/tesseract.js/blob/master/docs/image-format.md

这意味着库希望自己读取文件,而不是提供字节流进行分析。


推荐阅读