Я пытаюсь создать новый декодер для кода 32 (итальянский фармакод), используя библиотеку quagga2. Я видел, что это расширение кода 39, я создал этот файл, но не могу заставить его работать. Можете ли вы помочь мне, пожалуйста?
Я искал inte rnet и нашел эту библиотеку (https://github.com/ericblade/quagga2), которая подходит именно мне. Теперь я хотел бы иметь возможность реализовать код 32, я прочитал в inte rnet, что преобразование такое же, как код 39 (уже существует в библиотеке), я создал этот файл и добавил его в список штрих-кодов для использовать, но это не работает, я также нашел это в inte rnet для кодирования ... вы можете сказать, где я не прав?
файл, созданный мной:
Имя файла: code_32. js
Расположение файла: src / reader /
import BarcodeReader from './barcode_reader';
import ArrayHelper from '../common/array_helper.ts';
function Code32Reader() {
BarcodeReader.call(this);
}
var properties = {
ALPHABETH_STRING: {value: '0123456789BCDFGHJKLMNPQRSTUVWXYZ*'},
ALPHABET: {value: [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 66, 67, 68, 70, 71, 72, 74, 75, 76, 77, 78,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 42]},
CHARACTER_ENCODINGS: {value: [0x034, 0x121, 0x061, 0x160, 0x031, 0x130, 0x070, 0x025, 0x124, 0x064, 0x049,
0x148, 0x019, 0x058, 0x00D, 0x10C, 0x01C, 0x103, 0x043, 0x142, 0x013, 0x052, 0x007, 0x106, 0x046, 0x016,
0x181, 0x0C1, 0x1C0, 0x091, 0x190, 0x0D0, 0x094,
]},
ASTERISK: {value: 0x094},
FORMAT: {value: 'code_32', writeable: false},
};
Code32Reader.prototype = Object.create(BarcodeReader.prototype, properties);
Code32Reader.prototype.constructor = Code32Reader;
Code32Reader.prototype._decode = function() {
var self = this,
counters = [0, 0, 0, 0, 0, 0, 0, 0, 0],
result = [],
start = self._findStart(),
decodedChar,
lastStart,
pattern,
nextStart;
if (!start) {
return null;
}
nextStart = self._nextSet(self._row, start.end);
do {
counters = self._toCounters(nextStart, counters);
pattern = self._toPattern(counters);
if (pattern < 0) {
return null;
}
decodedChar = self._patternToChar(pattern);
if (decodedChar < 0){
return null;
}
result.push(decodedChar);
lastStart = nextStart;
nextStart += ArrayHelper.sum(counters);
nextStart = self._nextSet(self._row, nextStart);
} while (decodedChar !== '*');
result.pop();
if (!result.length) {
return null;
}
if (!self._verifyTrailingWhitespace(lastStart, nextStart, counters)) {
return null;
}
return {
code: result.join(''),
start: start.start,
end: nextStart,
startInfo: start,
decodedCodes: result,
};
};
Code32Reader.prototype._verifyTrailingWhitespace = function(lastStart, nextStart, counters) {
var trailingWhitespaceEnd,
patternSize = ArrayHelper.sum(counters);
trailingWhitespaceEnd = nextStart - lastStart - patternSize;
if ((trailingWhitespaceEnd * 3) >= patternSize) {
return true;
}
return false;
};
Code32Reader.prototype._patternToChar = function(pattern) {
var i,
self = this;
for (i = 0; i < self.CHARACTER_ENCODINGS.length; i++) {
if (self.CHARACTER_ENCODINGS[i] === pattern) {
return String.fromCharCode(self.ALPHABET[i]);
}
}
return -1;
};
Code32Reader.prototype._findNextWidth = function(counters, current) {
var i,
minWidth = Number.MAX_VALUE;
for (i = 0; i < counters.length; i++) {
if (counters[i] < minWidth && counters[i] > current) {
minWidth = counters[i];
}
}
return minWidth;
};
Code32Reader.prototype._toPattern = function(counters) {
var numCounters = counters.length,
maxNarrowWidth = 0,
numWideBars = numCounters,
wideBarWidth = 0,
self = this,
pattern,
i;
while (numWideBars > 3) {
maxNarrowWidth = self._findNextWidth(counters, maxNarrowWidth);
numWideBars = 0;
pattern = 0;
for (i = 0; i < numCounters; i++) {
if (counters[i] > maxNarrowWidth) {
pattern |= 1 << (numCounters - 1 - i);
numWideBars++;
wideBarWidth += counters[i];
}
}
if (numWideBars === 3) {
for (i = 0; i < numCounters && numWideBars > 0; i++) {
if (counters[i] > maxNarrowWidth) {
numWideBars--;
if ((counters[i] * 2) >= wideBarWidth) {
return -1;
}
}
}
return pattern;
}
}
return -1;
};
Code32Reader.prototype._findStart = function() {
var self = this,
offset = self._nextSet(self._row),
patternStart = offset,
counter = [0, 0, 0, 0, 0, 0, 0, 0, 0],
counterPos = 0,
isWhite = false,
i,
j,
whiteSpaceMustStart;
for ( i = offset; i < self._row.length; i++) {
if (self._row[i] ^ isWhite) {
counter[counterPos]++;
} else {
if (counterPos === counter.length - 1) {
// find start pattern
if (self._toPattern(counter) === self.ASTERISK) {
whiteSpaceMustStart = Math.floor(Math.max(0, patternStart - ((i - patternStart) / 4)));
if (self._matchRange(whiteSpaceMustStart, patternStart, 0)) {
return {
start: patternStart,
end: i,
};
}
}
patternStart += counter[0] + counter[1];
for ( j = 0; j < 7; j++) {
counter[j] = counter[j + 2];
}
counter[7] = 0;
counter[8] = 0;
counterPos--;
} else {
counterPos++;
}
counter[counterPos] = 1;
isWhite = !isWhite;
}
}
return null;
};
export default Code32Reader;
Я изменил этот файл, добавив декодер:
src / decoder / barcode_decoder . js
Добавить (строка: 16): импортировать Code32Reader из '../reader/code_32';
Добавить (строка: 31) : code_32: Code32Reader,
Метод преобразования (найдено в Интернете):
` Conversion from CODE 39
` to Italian Farmaceutical Code
` for bar code reader
` whithout automatic conversion
` R.V. 29/07/2000
C_TEXT($1;$0)
C_REAL($result)
C_INTEGER($len;$base10;$base32)
$result:=0
$len:=Length($1)
For ($X;1;$len)
$char:=($1<=($len-$X+1)>=)
$base32:=Ascii($char)
$base10:=$base32-(48+(8*Num($base32>65))+*Num($base32>69)+*Num($base32>73)+*Num($base32>79))
$result:=$result+($base10*(32^($X-1)))
End for
$0:=String($result)
$0:=("0"*Num(Length($0)=8))+$0
` Conversion from CODE 39
` to CODE 32 Farmacod
` (Italian farmaceutical code)
` R.V. 29/07/2002
C_TEXT($1;$0)
C_REAL($value)
C_INTEGER($X;$codASCII)
C_LONGINT($base32)
$value:=Num($1)
$0:=""
For ($X;1;6)
$base32:=$value-(Int($value/32)*32)
$codASCII:=$base32+48+((8*Num($base32>9))+Num($base32>12)+Num($base32>15)+Num($base32>20))
$0:=Char($codASCII)+$0
$value:=Int($value/32)
End for
Символы исключают A, E, I, O