mirror of
https://github.com/serratus/quaggaJS.git
synced 2026-08-12 21:21:42 +08:00
Added UPC-E Reader
This commit is contained in:
Vendored
+126
-9
@@ -1259,10 +1259,9 @@ define(
|
||||
}
|
||||
};
|
||||
|
||||
EANReader.prototype._findEnd = function(offset) {
|
||||
EANReader.prototype._verifyTrailingWhitespace = function(endInfo) {
|
||||
var self = this,
|
||||
trailingWhitespaceEnd,
|
||||
endInfo = self._findPattern(self.STOP_PATTERN, offset);
|
||||
trailingWhitespaceEnd;
|
||||
|
||||
trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start);
|
||||
if (trailingWhitespaceEnd < self._row.length) {
|
||||
@@ -1270,7 +1269,13 @@ define(
|
||||
return endInfo;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
EANReader.prototype._findEnd = function(offset, isWhite) {
|
||||
var self = this,
|
||||
endInfo = self._findPattern(self.STOP_PATTERN, offset, isWhite);
|
||||
|
||||
return self._verifyTrailingWhitespace(endInfo);
|
||||
};
|
||||
|
||||
EANReader.prototype._decodePayload = function(code, result, decodedCodes) {
|
||||
@@ -1328,7 +1333,7 @@ define(
|
||||
};
|
||||
decodedCodes.push(code);
|
||||
code = self._decodePayload(code, result, decodedCodes);
|
||||
code = self._findEnd(code.end);
|
||||
code = self._findEnd(code.end, false);
|
||||
if (code === null){
|
||||
return null;
|
||||
}
|
||||
@@ -7115,6 +7120,115 @@ define(
|
||||
/* jshint undef: true, unused: true, browser:true, devel: true */
|
||||
/* global define */
|
||||
|
||||
define(
|
||||
'upc_e_reader',[
|
||||
"./ean_reader"
|
||||
],
|
||||
function(EANReader) {
|
||||
|
||||
|
||||
function UPCEReader() {
|
||||
EANReader.call(this);
|
||||
}
|
||||
|
||||
var properties = {
|
||||
CODE_FREQUENCY : {value: [
|
||||
[ 56, 52, 50, 49, 44, 38, 35, 42, 41, 37 ],
|
||||
[7, 11, 13, 14, 19, 25, 28, 21, 22, 26]]},
|
||||
STOP_PATTERN: { value: [1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7]}
|
||||
};
|
||||
|
||||
UPCEReader.prototype = Object.create(EANReader.prototype, properties);
|
||||
UPCEReader.prototype.constructor = UPCEReader;
|
||||
|
||||
UPCEReader.prototype._decodePayload = function(code, result, decodedCodes) {
|
||||
var i,
|
||||
self = this,
|
||||
codeFrequency = 0x0;
|
||||
|
||||
for ( i = 0; i < 6; i++) {
|
||||
code = self._decodeCode(code.end);
|
||||
if (code.code >= self.CODE_G_START) {
|
||||
code.code = code.code - self.CODE_G_START;
|
||||
codeFrequency |= 1 << (5 - i);
|
||||
} else {
|
||||
codeFrequency |= 0 << (5 - i);
|
||||
}
|
||||
result.push(code.code);
|
||||
decodedCodes.push(code);
|
||||
}
|
||||
self._determineParity(codeFrequency, result);
|
||||
|
||||
return code;
|
||||
};
|
||||
|
||||
UPCEReader.prototype._determineParity = function(codeFrequency, result) {
|
||||
var self =this,
|
||||
i,
|
||||
nrSystem;
|
||||
|
||||
for (nrSystem = 0; nrSystem < self.CODE_FREQUENCY.length; nrSystem++){
|
||||
for ( i = 0; i < self.CODE_FREQUENCY[nrSystem].length; i++) {
|
||||
if (codeFrequency === self.CODE_FREQUENCY[nrSystem][i]) {
|
||||
result.unshift(nrSystem);
|
||||
result.push(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
UPCEReader.prototype._convertToUPCA = function(result) {
|
||||
var upca = [result[0]],
|
||||
lastDigit = result[result.length - 2];
|
||||
|
||||
if (lastDigit <= 2) {
|
||||
upca = upca.concat(result.slice(1, 3))
|
||||
.concat([lastDigit, 0, 0, 0, 0])
|
||||
.concat(result.slice(3, 6));
|
||||
} else if (lastDigit === 3) {
|
||||
upca = upca.concat(result.slice(1, 4))
|
||||
.concat([0 ,0, 0, 0, 0])
|
||||
.concat(result.slice(4,6));
|
||||
} else if (lastDigit === 4) {
|
||||
upca = upca.concat(result.slice(1, 5))
|
||||
.concat([0, 0, 0, 0, 0, result[5]]);
|
||||
} else {
|
||||
upca = upca.concat(result.slice(1, 6))
|
||||
.concat([0, 0, 0, 0, lastDigit]);
|
||||
}
|
||||
|
||||
upca.push(result[result.length - 1]);
|
||||
return upca;
|
||||
};
|
||||
|
||||
UPCEReader.prototype._checksum = function(result) {
|
||||
return EANReader.prototype._checksum.call(this, this._convertToUPCA(result));
|
||||
};
|
||||
|
||||
UPCEReader.prototype._findEnd = function(offset, isWhite) {
|
||||
isWhite = true;
|
||||
return EANReader.prototype._findEnd.call(this, offset, isWhite);
|
||||
};
|
||||
|
||||
UPCEReader.prototype._verifyTrailingWhitespace = function(endInfo) {
|
||||
var self = this,
|
||||
trailingWhitespaceEnd;
|
||||
|
||||
trailingWhitespaceEnd = endInfo.end + ((endInfo.end - endInfo.start)/2);
|
||||
if (trailingWhitespaceEnd < self._row.length) {
|
||||
if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
|
||||
return endInfo;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (UPCEReader);
|
||||
}
|
||||
);
|
||||
/* jshint undef: true, unused: true, browser:true, devel: true */
|
||||
/* global define */
|
||||
|
||||
define('barcode_decoder',[
|
||||
"bresenham",
|
||||
"image_debug",
|
||||
@@ -7123,7 +7237,8 @@ define('barcode_decoder',[
|
||||
'code_39_reader',
|
||||
'codabar_reader',
|
||||
'upc_reader',
|
||||
'ean_8_reader'
|
||||
'ean_8_reader',
|
||||
'upc_e_reader'
|
||||
], function(
|
||||
Bresenham,
|
||||
ImageDebug,
|
||||
@@ -7132,7 +7247,8 @@ define('barcode_decoder',[
|
||||
Code39Reader,
|
||||
CodabarReader,
|
||||
UPCReader,
|
||||
EAN8Reader) {
|
||||
EAN8Reader,
|
||||
UPCEReader) {
|
||||
|
||||
|
||||
var readers = {
|
||||
@@ -7141,7 +7257,8 @@ define('barcode_decoder',[
|
||||
ean_8_reader: EAN8Reader,
|
||||
code_39_reader: Code39Reader,
|
||||
codabar_reader: CodabarReader,
|
||||
upc_reader: UPCReader
|
||||
upc_reader: UPCReader,
|
||||
upc_e_reader: UPCEReader
|
||||
};
|
||||
var BarcodeDecoder = {
|
||||
create : function(config, inputImageWrapper) {
|
||||
@@ -7353,7 +7470,7 @@ define('barcode_decoder',[
|
||||
line = getLine(box);
|
||||
lineLength = getLineLength(line);
|
||||
lineAngle = Math.atan2(line[1].y - line[0].y, line[1].x - line[0].x);
|
||||
line = getExtendedLine(line, lineAngle, Math.floor(lineLength*0.07));
|
||||
line = getExtendedLine(line, lineAngle, Math.floor(lineLength*0.1));
|
||||
if(line === null){
|
||||
return null;
|
||||
}
|
||||
|
||||
Vendored
+4
-4
File diff suppressed because one or more lines are too long
@@ -45,8 +45,9 @@
|
||||
<option value="code_128">Code 128</option>
|
||||
<option value="code_39">Code 39</option>
|
||||
<option value="ean">EAN</option>
|
||||
<option value="ean_8" selected="selected">EAN-8</option>
|
||||
<option value="ean_8">EAN-8</option>
|
||||
<option value="upc">UPC</option>
|
||||
<option value="upc_e" selected="selected">UPC-E</option>
|
||||
<option value="codabar">Codabar</option>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
@@ -99,7 +99,7 @@ $(function() {
|
||||
},
|
||||
numOfWorkers: 0,
|
||||
decoder: {
|
||||
readers: ["ean_8_reader"],
|
||||
readers: ["upc_e_reader"],
|
||||
showFrequency: true,
|
||||
showPattern: true
|
||||
},
|
||||
|
||||
@@ -9,7 +9,8 @@ define([
|
||||
'code_39_reader',
|
||||
'codabar_reader',
|
||||
'upc_reader',
|
||||
'ean_8_reader'
|
||||
'ean_8_reader',
|
||||
'upc_e_reader'
|
||||
], function(
|
||||
Bresenham,
|
||||
ImageDebug,
|
||||
@@ -18,7 +19,8 @@ define([
|
||||
Code39Reader,
|
||||
CodabarReader,
|
||||
UPCReader,
|
||||
EAN8Reader) {
|
||||
EAN8Reader,
|
||||
UPCEReader) {
|
||||
"use strict";
|
||||
|
||||
var readers = {
|
||||
@@ -27,7 +29,8 @@ define([
|
||||
ean_8_reader: EAN8Reader,
|
||||
code_39_reader: Code39Reader,
|
||||
codabar_reader: CodabarReader,
|
||||
upc_reader: UPCReader
|
||||
upc_reader: UPCReader,
|
||||
upc_e_reader: UPCEReader
|
||||
};
|
||||
var BarcodeDecoder = {
|
||||
create : function(config, inputImageWrapper) {
|
||||
@@ -239,7 +242,7 @@ define([
|
||||
line = getLine(box);
|
||||
lineLength = getLineLength(line);
|
||||
lineAngle = Math.atan2(line[1].y - line[0].y, line[1].x - line[0].x);
|
||||
line = getExtendedLine(line, lineAngle, Math.floor(lineLength*0.07));
|
||||
line = getExtendedLine(line, lineAngle, Math.floor(lineLength*0.1));
|
||||
if(line === null){
|
||||
return null;
|
||||
}
|
||||
|
||||
+10
-5
@@ -186,10 +186,9 @@ define(
|
||||
}
|
||||
};
|
||||
|
||||
EANReader.prototype._findEnd = function(offset) {
|
||||
EANReader.prototype._verifyTrailingWhitespace = function(endInfo) {
|
||||
var self = this,
|
||||
trailingWhitespaceEnd,
|
||||
endInfo = self._findPattern(self.STOP_PATTERN, offset);
|
||||
trailingWhitespaceEnd;
|
||||
|
||||
trailingWhitespaceEnd = endInfo.end + (endInfo.end - endInfo.start);
|
||||
if (trailingWhitespaceEnd < self._row.length) {
|
||||
@@ -197,7 +196,13 @@ define(
|
||||
return endInfo;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
EANReader.prototype._findEnd = function(offset, isWhite) {
|
||||
var self = this,
|
||||
endInfo = self._findPattern(self.STOP_PATTERN, offset, isWhite);
|
||||
|
||||
return self._verifyTrailingWhitespace(endInfo);
|
||||
};
|
||||
|
||||
EANReader.prototype._decodePayload = function(code, result, decodedCodes) {
|
||||
@@ -255,7 +260,7 @@ define(
|
||||
};
|
||||
decodedCodes.push(code);
|
||||
code = self._decodePayload(code, result, decodedCodes);
|
||||
code = self._findEnd(code.end);
|
||||
code = self._findEnd(code.end, false);
|
||||
if (code === null){
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
/* jshint undef: true, unused: true, browser:true, devel: true */
|
||||
/* global define */
|
||||
|
||||
define(
|
||||
[
|
||||
"./ean_reader"
|
||||
],
|
||||
function(EANReader) {
|
||||
"use strict";
|
||||
|
||||
function UPCEReader() {
|
||||
EANReader.call(this);
|
||||
}
|
||||
|
||||
var properties = {
|
||||
CODE_FREQUENCY : {value: [
|
||||
[ 56, 52, 50, 49, 44, 38, 35, 42, 41, 37 ],
|
||||
[7, 11, 13, 14, 19, 25, 28, 21, 22, 26]]},
|
||||
STOP_PATTERN: { value: [1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7, 1 / 6 * 7]}
|
||||
};
|
||||
|
||||
UPCEReader.prototype = Object.create(EANReader.prototype, properties);
|
||||
UPCEReader.prototype.constructor = UPCEReader;
|
||||
|
||||
UPCEReader.prototype._decodePayload = function(code, result, decodedCodes) {
|
||||
var i,
|
||||
self = this,
|
||||
codeFrequency = 0x0;
|
||||
|
||||
for ( i = 0; i < 6; i++) {
|
||||
code = self._decodeCode(code.end);
|
||||
if (code.code >= self.CODE_G_START) {
|
||||
code.code = code.code - self.CODE_G_START;
|
||||
codeFrequency |= 1 << (5 - i);
|
||||
} else {
|
||||
codeFrequency |= 0 << (5 - i);
|
||||
}
|
||||
result.push(code.code);
|
||||
decodedCodes.push(code);
|
||||
}
|
||||
self._determineParity(codeFrequency, result);
|
||||
|
||||
return code;
|
||||
};
|
||||
|
||||
UPCEReader.prototype._determineParity = function(codeFrequency, result) {
|
||||
var self =this,
|
||||
i,
|
||||
nrSystem;
|
||||
|
||||
for (nrSystem = 0; nrSystem < self.CODE_FREQUENCY.length; nrSystem++){
|
||||
for ( i = 0; i < self.CODE_FREQUENCY[nrSystem].length; i++) {
|
||||
if (codeFrequency === self.CODE_FREQUENCY[nrSystem][i]) {
|
||||
result.unshift(nrSystem);
|
||||
result.push(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
UPCEReader.prototype._convertToUPCA = function(result) {
|
||||
var upca = [result[0]],
|
||||
lastDigit = result[result.length - 2];
|
||||
|
||||
if (lastDigit <= 2) {
|
||||
upca = upca.concat(result.slice(1, 3))
|
||||
.concat([lastDigit, 0, 0, 0, 0])
|
||||
.concat(result.slice(3, 6));
|
||||
} else if (lastDigit === 3) {
|
||||
upca = upca.concat(result.slice(1, 4))
|
||||
.concat([0 ,0, 0, 0, 0])
|
||||
.concat(result.slice(4,6));
|
||||
} else if (lastDigit === 4) {
|
||||
upca = upca.concat(result.slice(1, 5))
|
||||
.concat([0, 0, 0, 0, 0, result[5]]);
|
||||
} else {
|
||||
upca = upca.concat(result.slice(1, 6))
|
||||
.concat([0, 0, 0, 0, lastDigit]);
|
||||
}
|
||||
|
||||
upca.push(result[result.length - 1]);
|
||||
return upca;
|
||||
};
|
||||
|
||||
UPCEReader.prototype._checksum = function(result) {
|
||||
return EANReader.prototype._checksum.call(this, this._convertToUPCA(result));
|
||||
};
|
||||
|
||||
UPCEReader.prototype._findEnd = function(offset, isWhite) {
|
||||
isWhite = true;
|
||||
return EANReader.prototype._findEnd.call(this, offset, isWhite);
|
||||
};
|
||||
|
||||
UPCEReader.prototype._verifyTrailingWhitespace = function(endInfo) {
|
||||
var self = this,
|
||||
trailingWhitespaceEnd;
|
||||
|
||||
trailingWhitespaceEnd = endInfo.end + ((endInfo.end - endInfo.start)/2);
|
||||
if (trailingWhitespaceEnd < self._row.length) {
|
||||
if (self._matchRange(endInfo.end, trailingWhitespaceEnd, 0)) {
|
||||
return endInfo;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (UPCEReader);
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user