【问题标题】:Node.js javascript-barcode-reader gives null on scanning imageNode.js javascript-barcode-reader 在扫描图像时给出 null
【发布时间】:2019-03-17 10:44:59
【问题描述】:

我正在从 node.js 中上传的图像中读取多个条形码。为此,我使用 javascript-barcode-reader,它需要 ImageData 作为输入。要获取图像的 ImageData,我必须使用 node-canvas因为我必须在 Nodejs 中完成这一切,而不是前端)。

下面的代码执行时没有任何警告/错误。目前,我只使用单个条形码图像,但我将code 设为空。

这里出了什么问题,为什么我得到 null 值。

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

最初,我只尝试单个条形码图像。

【问题讨论】:

  • 你也可以分享你的图片吗?

标签: javascript node.js barcode barcode-scanner node-canvas


【解决方案1】:

这里有两个陷阱:

  1. 无效使用 readFileSync 回调。
  2. 在注册img.onload处理程序之前分配img.src

检查这个工作示例的同步版本和承诺版本

    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);
    })

【讨论】:

  • 我仍然得到 null,打印值为 buf imgData 给出所有 0。
  • 上面的例子给出了`同步版本1520152015201520异步版本1520152015201520`你确定你应用了同样的逻辑吗?
  • 您试用的是什么版本的javascript-barcode-reader,当天有版本更新,我提问,您回答。我正在使用(V0.3.1)。
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多