#include <node.h>#include <string.h>#include "If_DBR.h"#include "BarcodeFormat.h"#include "BarcodeStructs.h"#include "ErrorCode.h"using namespace v8;void DecodeFile(const FunctionCallbackInfo<Value>& args) {}void Init(Handle<Object> exports) {NODE_SET_METHOD(exports, "decodeFile", DecodeFile);}NODE_MODULE(dbr, Init)解析来自 JavaScript 传递过来的参数Isolate* isolate = Isolate::GetCurrent();HandleScope scope(isolate);String::Utf8Value license(args[0]->ToString());String::Utf8Value fileName(args[1]->ToString());char *pFileName = *fileName;char *pszLicense = *license;__int64 llFormat = args[2]->IntegerValue();Local<Function> cb = Local<Function>::Cast(args[3]);解析条形码图像:
int iMaxCount = 0x7FFFFFFF;ReaderOptions ro = {0};pBarcodeResultArray pResults = NULL;ro.llBarcodeFormat = llFormat;ro.iMaxBarcodesNumPerPage = iMaxCount;DBR_InitLicense(pszLicense);// Decode barcode imageint ret = DBR_DecodeFile(pFileName, &ro, &pResults);将条形码转成字符串:const char * GetFormatStr(__int64 format){if (format == CODE_39)return "CODE_39";if (format == CODE_128)return "CODE_128";if (format == CODE_93)return "CODE_93";if (format == CODABAR)return "CODABAR";if (format == ITF)return "ITF";if (format == UPC_A)return "UPC_A";if (format == UPC_E)return "UPC_E";if (format == EAN_13)return "EAN_13";if (format == EAN_8)return "EAN_8";if (format == INDUSTRIAL_25)return "INDUSTRIAL_25";if (format == QR_CODE)return "QR_CODE";if (format == PDF417)return "PDF417";if (format == DATAMATRIX)return "DATAMATRIX";return "UNKNOWN";}将结果转成 v8 对象:Local<Array> barcodeResults = Array::New(isolate);for (int i = 0; i < count; i++){tmp = ppBarcodes[i];Local<Object> result = Object::New(isolate);result->Set(String::NewFromUtf8(isolate, "format"), String::NewFromUtf8(isolate, GetFormatStr(tmp->llFormat)));result->Set(String::NewFromUtf8(isolate, "value"), String::NewFromUtf8(isolate, tmp->pBarcodeData));barcodeResults->Set(Number::New(isolate, i), result);}构建扩展{"targets": [{"target_name": "dbr","sources": [ "dbr.cc" ],"conditions": [["OS=="linux"", {"defines": ["LINUX_DBR",],"include_dirs": ["/home/xiao/Dynamsoft/BarcodeReader4.0/Include"],"libraries": ["-lDynamsoftBarcodeReaderx64", "-L/home/xiao/Dynamsoft/BarcodeReader4.0/Redist"],"copies": [{"destination": "build/Release/","files": ["/home/xiao/Dynamsoft/BarcodeReader4.0/Redist/libDynamsoftBarcodeReaderx64.so"]}]}],["OS=="win"", {"defines": ["WINDOWS_DBR",],"include_dirs": ["F:/Program Files (x86)/Dynamsoft/Barcode Reader 4.1/Components/C_C++/Include"],"libraries": ["-lF:/Program Files (x86)/Dynamsoft/Barcode Reader 4.1/Components/C_C++/Lib/DBRx64.lib"],"copies": [{"destination": "build/Release/","files": ["F:/Program Files (x86)/Dynamsoft/Barcode Reader 4.1/Components/C_C++/Redist/DynamsoftBarcodeReaderx64.dll"]}]}],["OS=="mac"", {"defines": ["MAC_DBR",],"include_dirs" : ["/Applications/Dynamsoft/Barcode/ Reader/ 4.1/Include"],"libraries": ["-lDynamsoftBarcodeReader"]}]]}]}将 DRB 安装目录替换成你机器上的实际目录。var formidable = require("formidable");var util = require("util");var express = require("express");var fs = require("fs");var app = express();var path = require("path");var dbr = require("./build/Release/dbr");var http = require("http");fs.readFile("./license.txt", "utf8", function(err, data) {app.use(express.static(__dirname));app.use(function(req, res, next) {res.header("Access-Control-Allow-Origin", "*");res.header("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS");res.header("Access-Control-Allow-Headers", "X-Requested-With, content-type");res.header("Access-Control-Allow-Credentials", true);next();});var server = app.listen(2016, function() {var host = server.address().address;var port = server.address().port;console.log("listening at http://%s:%s", host, port);});});使用 Formidable 从表单中提取图像数据:app.post("/upload", function(req, res) {var form = new formidable.IncomingForm();form.parse(req, function(err, fields, files) {var dir = "uploads";fs.mkdir(dir, function(err) {var flag = fields.uploadFlag;var barcodeType = parseInt(fields.barcodetype);console.log("flag: " + flag);if (flag === "1") { // read barcode image filefs.readFile(files.fileToUpload.path, function(err, data) {// save file from temp dir to new dirvar fileName = path.join(__dirname, dir, files.fileToUpload.name);console.log(fileName);fs.writeFile(fileName, data, function(err) {if (err) throw err;});});} else { // read barcode image urlvar tmpFileName = path.join(__dirname, dir, "tmp.jpg");var tmp = fs.createWriteStream(tmpFileName);var url = fields.fileToDownload;console.log("url: " + url);http.get(url, function(response) {response.pipe(tmp);tmp.on("finish", function() {tmp.close(function() {});});});}});});});导入条形码模块用来解析图像文件:
以上所述是小编给大家介绍的Node.js 条形码识别程序构建思路详解,希望对大家有所帮助。