国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Node.js 條形碼識別程序構建思路詳解

2019-11-20 10:36:11
字體:
來源:轉載
供稿:網友

在這篇文章中,我們將展示一個非常簡單的方法構建一個自定義的 Node 模塊,該模塊封裝了Dynamsoft Barcode Reader SDK ,支持 Windows、Linux 和 OS X,同時我們將演示如何集成這塊模塊實現一個在線的條形碼讀取應用。

越來越多的 Web 開發者選擇 Node 來構建網站,因為使用 JavaScript 來開發復雜的服務器端 Web 應用越來越便利。為了擴展在不同平臺下的 Node 的功能,Node 允許開發者使用 C/C++ 來創建擴展。

介紹

Dynamsoft Barcode Reader 為 Windows、Linux 和 OS X 提供條形碼解析的 C/C++ 共享庫。其最大的優勢是適用于多種高級編程語言,包括 JavaScript, Python, Java, Ruby, PHP 等,只要可以封裝 C/C++ API 作為一個擴展就可以使用。不管是什么編程語言,最終只需要簡單幾行代碼即可完成條形碼的解析。

支持 1D/2D 條形碼類型

Code 39, Code 93, Code 128, Codabar, Interleaved 2 of 5, EAN-8, EAN-13, UPC-A, UPC-E,Industrial 2 of 5
QRCode
DataMatrix
PDF417

支持圖像類型

BMP, JPEG, PNG, GIF, TIFF, PDF

運行環境

Windows, Linux & Mac
Node v5.5.0

Node.js 條形碼擴展

Node.js 擴展使用 C/C++ 編寫的動態鏈接的共享對象。如果你沒有接觸過這方面的技術,可以閱讀 官方教程 。

創建擴展

創建名為 dbr.cc 的文件,并添加方法 DecodeFile:

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

構建擴展

要求:

Windows: 需要安裝 DBR for Windows, visual Studio, and Python v2.7.

Linux: 安裝 DBR for Linux.

Mac: 安裝 DBR for Mac 和 Xcode.

安裝 node-gyp:

npm install -g node-gyp

創建 binding.gyp 用于多平臺編譯:

{"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 安裝目錄替換成你機器上的實際目錄。

配置構建環境:

node-gyp configure

可以在 Mac 上你會碰到下面的錯誤:

error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

解決辦法是:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

構建項目:

node-gyp build

在線條形碼解析

你已經成功的構建了 Node 的條形碼解析模塊,現在可以創建一個簡單的條形碼讀取應用。

安裝 Express 和 Formidable:

npm install express
npm install formidable

使用 Express 創建一個簡單應用:

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

導入條形碼模塊用來解析圖像文件:

decodeBarcode(res, license, tmpFileName, barcodeType);

運行應用:

node server.js

訪問 http://localhost:2016/index.htm:


以上所述是小編給大家介紹的Node.js 條形碼識別程序構建思路詳解,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高平市| 屯门区| 白城市| 西藏| 奉贤区| 板桥市| 涞水县| 柳林县| 阜新市| 惠州市| 厦门市| 洪泽县| 高尔夫| 鸡泽县| 井冈山市| 四川省| 磴口县| 麻江县| 彭山县| 新民市| 青岛市| 云和县| 汉中市| 珲春市| 阜宁县| 界首市| 临潭县| 崇义县| 亳州市| 前郭尔| 宝清县| 禄丰县| 雷波县| 平凉市| 商洛市| 进贤县| 洱源县| 新宁县| 庆云县| 无棣县| 梁河县|