Node.js javascript-barcode-reader дает нулевое значение при сканировании изображения - PullRequest
0 голосов
/ 12 октября 2018

Я работаю над чтением нескольких штрих-кодов из загруженных изображений в node.js.Для этого я использую javascript-barcode-reader , для которого требуется ImageData в качестве входных данных.чтобы получить ImageData изображения, мне пришлось использовать node-canvas (, поскольку я должен делать все это в Nodejs, а не front-end ),

приведенный ниже код выполняется без предупреждения / ошибки.В настоящее время я использую только одно изображение штрих-кода, но я получаю code как ноль.

что здесь происходит, почему я получаю ноль значение.

const Canvas = require('canvas');
const javascriptBarcodeReader = require('javascript-barcode-reader');

var filepath = './images/Code-2of5.jpg';
var buf = fs.readFileSync(filepath);
var canvas = new Canvas(640, 480);
var Image = Canvas.Image;
var ctx = canvas.getContext('2d');

fs.readFileSync(filepath, function (err, squid) {
    if (err) throw err;
    let img = new Image;
    img.src = squid;
    img.onload = function () {
        ctx.drawImage(img, 0, 0, 640, 480);
    }
});

let imgData = ctx.getImageData(0, 0, 640, 480);
const code = javascriptBarcodeReader(imgData /* ImageData */ , { 
    barcode: 'code-2of5', // 'code-128'
    type: 'interleaved', //standard/interleaved optional type
});

console.log(code); // output as null

Изначально я пытаюсь использовать только одно изображение штрих-кода.

enter image description here

1 Ответ

0 голосов
/ 12 октября 2018

здесь есть 2 ошибки:

  1. недопустимое использование readFileSync с обратным вызовом.
  2. назначение img.src перед регистром img.onload обработчик.

проверьте этот рабочий пример и синхронизацию, и обещанную версию

    const fs = require('fs');
    const Canvas = require('canvas');
    const javascriptBarcodeReader = require('javascript-barcode-reader');

    function readBarCodeSync(imagePath) {
      const canvas = new Canvas(640, 480);
      const Image = Canvas.Image;
      const ctx = canvas.getContext('2d');

      const img = new Image;
      img.onload = function () {
        ctx.drawImage(img, 0, 0, 640, 480);
      }
      img.src = fs.readFileSync(imagePath);

      const imgData = ctx.getImageData(0, 0, 640, 480);
      const code = javascriptBarcodeReader(imgData /* ImageData */ , {
        barcode: 'code-2of5', // 'code-128'
        type: 'interleaved', //standard/interleaved optional type
      });

      return code;
    }

    function readBarCode (imagePath) {
      const canvas = new Canvas(640, 480);
      const Image = Canvas.Image;
      const ctx = canvas.getContext('2d');

      const img = new Image;
      img.onload = function () {
        ctx.drawImage(img, 0, 0, 640, 480);
      }
      return new Promise((resolve,reject)=>{
        fs.readFile(imagePath,(err,buf)=>{
          if(err) return reject(err);
          img.src = buf;
          const imgData = ctx.getImageData(0, 0, 640, 480);
          const code = javascriptBarcodeReader(imgData /* ImageData */ , {
            barcode: 'code-2of5', // 'code-128'
            type: 'interleaved', //standard/interleaved optional type
          });
          resolve(code);
        });
      });
    }

    var imagePath = './images/Code-2of5.jpg';

    console.log('sync version', readBarCodeSync(imagePath))
    readBarCode(imagePath)
    .then(barCode=>{
      console.log('async version', barCode);
    })
    .catch(err=>{
      console.error(err);
    })
...