欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js 條形碼識別程序構(gòu)建思路詳解

 更新時間:2016年02月14日 09:30:26   投稿:mrr  
這篇文章主要介紹了Node.js 條形碼識別程序構(gòu)建思路詳解的相關(guān)資料,需要的朋友可以參考下

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

越來越多的 Web 開發(fā)者選擇 Node 來構(gòu)建網(wǎng)站,因為使用 JavaScript 來開發(fā)復(fù)雜的服務(wù)器端 Web 應(yīng)用越來越便利。為了擴展在不同平臺下的 Node 的功能,Node 允許開發(fā)者使用 C/C++ 來創(chuàng)建擴展。

介紹

Dynamsoft Barcode Reader 為 Windows、Linux 和 OS X 提供條形碼解析的 C/C++ 共享庫。其最大的優(yōu)勢是適用于多種高級編程語言,包括 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

運行環(huán)境

Windows, Linux & Mac
Node v5.5.0

Node.js 條形碼擴展

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

創(chuàng)建擴展

創(chuàng)建名為 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 傳遞過來的參數(shù)

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 image
int ret = DBR_DecodeFile(pFileName, &ro, &pResults);

將條形碼轉(zhuǎn)成字符串:

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

將結(jié)果轉(zhuǎn)成 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);
}

構(gòu)建擴展

要求:

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

創(chuàng)建 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 安裝目錄替換成你機器上的實際目錄。

配置構(gòu)建環(huán)境:

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

構(gòu)建項目:

node-gyp build

在線條形碼解析

你已經(jīng)成功的構(gòu)建了 Node 的條形碼解析模塊,現(xiàn)在可以創(chuàng)建一個簡單的條形碼讀取應(yīng)用。

安裝 Express 和 Formidable:

npm install express
npm install formidable

使用 Express 創(chuàng)建一個簡單應(yīng)用:

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 從表單中提取圖像數(shù)據(jù):

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 file
fs.readFile(files.fileToUpload.path, function(err, data) {
// save file from temp dir to new dir
var 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 url
var 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() {

});
});
});
}
});
});
});

導(dǎo)入條形碼模塊用來解析圖像文件:

decodeBarcode(res, license, tmpFileName, barcodeType);

運行應(yīng)用:

node server.js

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


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

相關(guān)文章

  • node.js中的fs.appendFile方法使用說明

    node.js中的fs.appendFile方法使用說明

    這篇文章主要介紹了node.js中的fs.appendFile方法使用說明,本文介紹了fs.appendFile方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js讀寫文件之批量替換圖片的實現(xiàn)方法

    Node.js讀寫文件之批量替換圖片的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狽ode.js讀寫文件之批量替換圖片的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • node異步使用await和不用await的區(qū)別實例分析

    node異步使用await和不用await的區(qū)別實例分析

    這篇文章主要介紹了node異步使用await和不用await的區(qū)別,結(jié)合實例形式分析了node.js異步使用await和不用await的實例中,同步與異步執(zhí)行的區(qū)別,需要的朋友可以參考下
    2023-06-06
  • 獨立部署小程序基于nodejs的服務(wù)器過程詳解

    獨立部署小程序基于nodejs的服務(wù)器過程詳解

    這篇文章主要介紹了獨立部署小程序基于nodejs的服務(wù)器過程詳解,完全自定義的部署小程序服務(wù)器, 不依托于騰訊云服務(wù)器體系. 以阿里云服務(wù)器為基礎(chǔ)建立.服務(wù)器語言選用nodejs.,需要的朋友可以參考下
    2019-06-06
  • Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解

    Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解

    這篇文章主要為大家介紹了Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • node實現(xiàn)shell命令管理工具及commander.js學(xué)習(xí)

    node實現(xiàn)shell命令管理工具及commander.js學(xué)習(xí)

    這篇文章主要為大家介紹了node實現(xiàn)shell命令管理工具及commander.js學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Nodejs實戰(zhàn)心得之eventproxy模塊控制并發(fā)

    Nodejs實戰(zhàn)心得之eventproxy模塊控制并發(fā)

    本篇文章給大家分享我的nodejs實戰(zhàn)心得,如何使用eventproxy模塊控制并發(fā),感興趣的朋友可以參考下
    2015-10-10
  • node.js中的buffer.fill方法使用說明

    node.js中的buffer.fill方法使用說明

    這篇文章主要介紹了node.js中的buffer.fill方法使用說明,本文介紹了buffer.fill的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 淺談JS前端模塊化的幾種規(guī)范

    淺談JS前端模塊化的幾種規(guī)范

    這篇文章主要介紹了JS前端模塊化的幾種規(guī)范,對前端模塊化感興趣的同學(xué),可以參考下
    2021-05-05
  • express中創(chuàng)建 websocket 接口及問題解答

    express中創(chuàng)建 websocket 接口及問題解答

    本文主要介紹了express中創(chuàng)建 websocket 接口及問題解答,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論