Node.js javascript-barcode-reader дает нулевое значение при сканировании изображения
Я работаю над чтением нескольких штрих-кодов из загруженных изображений в node.js. Для этого я использую https://www.npmjs.com/package/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
Первоначально я пробую только одно изображение штрих-кода.
1 ответ
Здесь есть 2 ошибки:
- недопустимое использование readFileSync с обратным вызовом.
- назначение
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);
})