Передача буфера как Uint8Array без нулевых байтов - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь передать данные изображения из 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); });

});

Который выдает ошибку от Teserract, говоря, что он хочет 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,
  ...

Где ошибка?


Если я сохраню файл образа на диск, а затем прочту его путь через Teserract - он сработает, поэтому проблема не в изображении.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

В документации говорится, что в Node JS параметр img должен быть путем к локальному образу.

В браузере изображение может быть:

  • элемент img, video или canvas
  • Файловый объект (из файла)
  • путь или URL-адрес доступного изображения

В Node.js изображение может быть

  • путь к локальному изображению

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

Это означает, что библиотека хотела бы самостоятельно читать файл, а не получать поток байтов для анализа.

0 голосов
/ 31 мая 2019

ниже работал для меня. Думаю, мы можем использовать разные версии tesseract (v.3.05), но не думаю, что он сильно изменится.

    var Jimp = require('jimp');
    var Tesseract = require('tesseract.js');
    var file = 'YourFile.png';  // Or .jpg etc...

    Jimp.read(file, async (err, image) => {
        if (err) throw err;

        //Do your Jimp stuff here to 'image' then...

        const buffer = await image.getBufferAsync(Jimp.AUTO);

        //Above line creates a buffer using Jimp.AUTO (the  
        //original file format from your variable 'file')

        Tesseract.recognize(buffer,'eng')
            .then(data => {
             console.log(data)
            })
     })
...