微信小程序帶參數(shù)生成條形碼

首先在utils文件下創(chuàng)建barcode.js與index.js兩個文件

1.在barcode.js中復(fù)制如下代碼(此代碼已經(jīng)改動過,測試可用):

var CHAR_TILDE = 126;

var CODE_FNC1 = 102;

var SET_STARTA = 103;

var SET_STARTB = 104;

var SET_STARTC = 105;

var SET_SHIFT = 98;

var SET_CODEA = 101;

var SET_CODEB = 100;

var SET_STOP = 106;

var REPLACE_CODES = {

? CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard

}

var CODESET = {

? ANY: 1,

? AB: 2,

? A: 3,

? B: 4,

? C: 5

};

function getBytes(str) {

? var bytes = [];

? for (var i = 0; i < str.length; i++) {

? ? bytes.push(str.charCodeAt(i));

? }

? return bytes;

}

exports.code128 = function (ctx, text, width, height) {

? width = parseInt(width);

? height = parseInt(height);

? var codes = stringToCode128(text);

? var g = new Graphics(ctx, width, height);

? var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);

? var x = g.area.left;

? var y = g.area.top;

? for (var i = 0; i < codes.length; i++) {

? ? var c = codes[i];

? ? //two bars at a time: 1 black and 1 white

? ? for (var bar = 0; bar < 8; bar += 2) {

? ? ? var barW = PATTERNS[c][bar] * barWeight;

? ? ? // var barH = height - y - this.border;

? ? ? var barH = height - y;

? ? ? var spcW = PATTERNS[c][bar + 1] * barWeight;

? ? ? //no need to draw if 0 width

? ? ? if (barW > 0) {

? ? ? ? g.fillFgRect(x, y, barW, barH);

? ? ? }

? ? ? x += barW + spcW;

? ? }

? }

? ctx.draw();

}

function stringToCode128(text) {

? var barc = {

? ? currcs: CODESET.C

? };

? var bytes = getBytes(text);

? //decide starting codeset

? var index = bytes[0] == CHAR_TILDE ? 1 : 0;

? var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;

? var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;

? barc.currcs = getBestStartSet(csa1, csa2);

? barc.currcs = perhapsCodeC(bytes, barc.currcs);

? //if no codeset changes this will end up with bytes.length+3

? //start, checksum and stop

? var codes = new Array();

? switch (barc.currcs) {

? ? case CODESET.A:

? ? ? codes.push(SET_STARTA);

? ? ? break;

? ? case CODESET.B:

? ? ? codes.push(SET_STARTB);

? ? ? break;

? ? default:

? ? ? codes.push(SET_STARTC);

? ? ? break;

? }

? for (var i = 0; i < bytes.length; i++) {

? ? var b1 = bytes[i]; //get the first of a pair

? ? //should we translate/replace

? ? if (b1 in REPLACE_CODES) {

? ? ? codes.push(REPLACE_CODES[b1]);

? ? ? i++ //jump to next

? ? ? b1 = bytes[i];

? ? }

? ? //get the next in the pair if possible

? ? var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;

? ? codes = codes.concat(codesForChar(b1, b2, barc.currcs));

? ? //code C takes 2 chars each time

? ? if (barc.currcs == CODESET.C) i++;

? }

? //calculate checksum according to Code 128 standards

? var checksum = codes[0];

? for (var weight = 1; weight < codes.length; weight++) {

? ? checksum += (weight * codes[weight]);

? }

? codes.push(checksum % 103);

? codes.push(SET_STOP);

? //encoding should now be complete

? return codes;

? function getBestStartSet(csa1, csa2) {

? ? //tries to figure out the best codeset

? ? //to start with to get the most compact code

? ? var vote = 0;

? ? vote += csa1 == CODESET.A ? 1 : 0;

? ? vote += csa1 == CODESET.B ? -1 : 0;

? ? vote += csa2 == CODESET.A ? 1 : 0;

? ? vote += csa2 == CODESET.B ? -1 : 0;

? ? //tie goes to B due to my own predudices

? ? return vote > 0 ? CODESET.A : CODESET.B;

? }

? function perhapsCodeC(bytes, codeset) {

? ? for (var i = 0; i < bytes.length; i++) {

? ? ? var b = bytes[i]

? ? ? if ((b < 48 || b > 57) && b != CHAR_TILDE)

? ? ? ? return codeset;

? ? }

? ? if (bytes.length % 2 == 0) {

? ? ? return CODESET.C

? ? }else{

? ? ? return CODESET.A;

? ? }

? }

? //chr1 is current byte

? //chr2 is the next byte to process. looks ahead.

? function codesForChar(chr1, chr2, currcs) {

? ? var result = [];

? ? var shifter = -1;

? ? if (charCompatible(chr1, currcs)) {

? ? ? if (currcs == CODESET.C) {

? ? ? ? if (chr2 == -1) {

? ? ? ? ? shifter = SET_CODEB;

? ? ? ? ? currcs = CODESET.B;

? ? ? ? }

? ? ? ? else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {

? ? ? ? ? //need to check ahead as well

? ? ? ? ? if (charCompatible(chr2, CODESET.A)) {

? ? ? ? ? ? shifter = SET_CODEA;

? ? ? ? ? ? currcs = CODESET.A;

? ? ? ? ? }

? ? ? ? ? else {

? ? ? ? ? ? shifter = SET_CODEB;

? ? ? ? ? ? currcs = CODESET.B;

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? }

? ? else {

? ? ? //if there is a next char AND that next char is also not compatible

? ? ? if ((chr2 != -1) && !charCompatible(chr2, currcs)) {

? ? ? ? //need to switch code sets

? ? ? ? switch (currcs) {

? ? ? ? ? case CODESET.A:

? ? ? ? ? ? shifter = SET_CODEB;

? ? ? ? ? ? currcs = CODESET.B;

? ? ? ? ? ? break;

? ? ? ? ? case CODESET.B:

? ? ? ? ? ? shifter = SET_CODEA;

? ? ? ? ? ? currcs = CODESET.A;

? ? ? ? ? ? break;

? ? ? ? }

? ? ? }

? ? ? else {

? ? ? ? //no need to shift code sets, a temporary SHIFT will suffice

? ? ? ? shifter = SET_SHIFT;

? ? ? }

? ? }

? ? //ok some type of shift is nessecary

? ? if (shifter != -1) {

? ? ? result.push(shifter);

? ? ? result.push(codeValue(chr1));

? ? }

? ? else {

? ? ? if (currcs == CODESET.C) {

? ? ? ? //include next as well

? ? ? ? result.push(codeValue(chr1, chr2));

? ? ? }

? ? ? else {

? ? ? ? result.push(codeValue(chr1));

? ? ? }

? ? }

? ? barc.currcs = currcs;

? ? return result;

? }

}

//reduce the ascii code to fit into the Code128 char table

function codeValue(chr1, chr2) {

? if (typeof chr2 == "undefined") {

? ? return chr1 >= 32 ? chr1 - 32 : chr1 + 64;

? }

? else {

? ? return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));

? }

}

function charCompatible(chr, codeset) {

? var csa = codeSetAllowedFor(chr);

? if (csa == CODESET.ANY) return true;

? //if we need to change from current

? if (csa == CODESET.AB) return true;

? if (csa == CODESET.A && codeset == CODESET.A) return true;

? if (csa == CODESET.B && codeset == CODESET.B) return true;

? return false;

}

function codeSetAllowedFor(chr) {

? if (chr >= 48 && chr <= 57) {

? ? //0-9

? ? return CODESET.ANY;

? }

? else if (chr >= 32 && chr <= 95) {

? ? //0-9 A-Z

? ? return CODESET.AB;

? }

? else {

? ? //if non printable

? ? return chr < 32 ? CODESET.A : CODESET.B;

? }

}

var Graphics = function (ctx, width, height) {

? this.width = width;

? this.height = height;

? this.quiet = Math.round(this.width / 40);

? this.border_size = 0;

? this.padding_width = 0;

? this.area = {

? ? width: width - this.padding_width * 2 - this.quiet * 2,

? ? height: height - this.border_size * 2,

? ? top: this.border_size - 4,

? ? left: this.padding_width + this.quiet

? };

? this.ctx = ctx;

? this.fg = "#000000";

? this.bg = "#ffffff";

? // fill background

? this.fillBgRect(0, 0, width, height);

? // fill center to create border

? this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);

}

//use native color

Graphics.prototype._fillRect = function (x, y, width, height, color) {

? this.ctx.setFillStyle(color)

? this.ctx.fillRect(x, y, width, height)

}

Graphics.prototype.fillFgRect = function (x, y, width, height) {

? this._fillRect(x, y, width, height, this.fg);

}

Graphics.prototype.fillBgRect = function (x, y, width, height) {

? this._fillRect(x, y, width, height, this.bg);

}

var PATTERNS = [

? [2, 1, 2, 2, 2, 2, 0, 0],? // 0

? [2, 2, 2, 1, 2, 2, 0, 0],? // 1

? [2, 2, 2, 2, 2, 1, 0, 0],? // 2

? [1, 2, 1, 2, 2, 3, 0, 0],? // 3

? [1, 2, 1, 3, 2, 2, 0, 0],? // 4

? [1, 3, 1, 2, 2, 2, 0, 0],? // 5

? [1, 2, 2, 2, 1, 3, 0, 0],? // 6

? [1, 2, 2, 3, 1, 2, 0, 0],? // 7

? [1, 3, 2, 2, 1, 2, 0, 0],? // 8

? [2, 2, 1, 2, 1, 3, 0, 0],? // 9

? [2, 2, 1, 3, 1, 2, 0, 0],? // 10

? [2, 3, 1, 2, 1, 2, 0, 0],? // 11

? [1, 1, 2, 2, 3, 2, 0, 0],? // 12

? [1, 2, 2, 1, 3, 2, 0, 0],? // 13

? [1, 2, 2, 2, 3, 1, 0, 0],? // 14

? [1, 1, 3, 2, 2, 2, 0, 0],? // 15

? [1, 2, 3, 1, 2, 2, 0, 0],? // 16

? [1, 2, 3, 2, 2, 1, 0, 0],? // 17

? [2, 2, 3, 2, 1, 1, 0, 0],? // 18

? [2, 2, 1, 1, 3, 2, 0, 0],? // 19

? [2, 2, 1, 2, 3, 1, 0, 0],? // 20

? [2, 1, 3, 2, 1, 2, 0, 0],? // 21

? [2, 2, 3, 1, 1, 2, 0, 0],? // 22

? [3, 1, 2, 1, 3, 1, 0, 0],? // 23

? [3, 1, 1, 2, 2, 2, 0, 0],? // 24

? [3, 2, 1, 1, 2, 2, 0, 0],? // 25

? [3, 2, 1, 2, 2, 1, 0, 0],? // 26

? [3, 1, 2, 2, 1, 2, 0, 0],? // 27

? [3, 2, 2, 1, 1, 2, 0, 0],? // 28

? [3, 2, 2, 2, 1, 1, 0, 0],? // 29

? [2, 1, 2, 1, 2, 3, 0, 0],? // 30

? [2, 1, 2, 3, 2, 1, 0, 0],? // 31

? [2, 3, 2, 1, 2, 1, 0, 0],? // 32

? [1, 1, 1, 3, 2, 3, 0, 0],? // 33

? [1, 3, 1, 1, 2, 3, 0, 0],? // 34

? [1, 3, 1, 3, 2, 1, 0, 0],? // 35

? [1, 1, 2, 3, 1, 3, 0, 0],? // 36

? [1, 3, 2, 1, 1, 3, 0, 0],? // 37

? [1, 3, 2, 3, 1, 1, 0, 0],? // 38

? [2, 1, 1, 3, 1, 3, 0, 0],? // 39

? [2, 3, 1, 1, 1, 3, 0, 0],? // 40

? [2, 3, 1, 3, 1, 1, 0, 0],? // 41

? [1, 1, 2, 1, 3, 3, 0, 0],? // 42

? [1, 1, 2, 3, 3, 1, 0, 0],? // 43

? [1, 3, 2, 1, 3, 1, 0, 0],? // 44

? [1, 1, 3, 1, 2, 3, 0, 0],? // 45

? [1, 1, 3, 3, 2, 1, 0, 0],? // 46

? [1, 3, 3, 1, 2, 1, 0, 0],? // 47

? [3, 1, 3, 1, 2, 1, 0, 0],? // 48

? [2, 1, 1, 3, 3, 1, 0, 0],? // 49

? [2, 3, 1, 1, 3, 1, 0, 0],? // 50

? [2, 1, 3, 1, 1, 3, 0, 0],? // 51

? [2, 1, 3, 3, 1, 1, 0, 0],? // 52

? [2, 1, 3, 1, 3, 1, 0, 0],? // 53

? [3, 1, 1, 1, 2, 3, 0, 0],? // 54

? [3, 1, 1, 3, 2, 1, 0, 0],? // 55

? [3, 3, 1, 1, 2, 1, 0, 0],? // 56

? [3, 1, 2, 1, 1, 3, 0, 0],? // 57

? [3, 1, 2, 3, 1, 1, 0, 0],? // 58

? [3, 3, 2, 1, 1, 1, 0, 0],? // 59

? [3, 1, 4, 1, 1, 1, 0, 0],? // 60

? [2, 2, 1, 4, 1, 1, 0, 0],? // 61

? [4, 3, 1, 1, 1, 1, 0, 0],? // 62

? [1, 1, 1, 2, 2, 4, 0, 0],? // 63

? [1, 1, 1, 4, 2, 2, 0, 0],? // 64

? [1, 2, 1, 1, 2, 4, 0, 0],? // 65

? [1, 2, 1, 4, 2, 1, 0, 0],? // 66

? [1, 4, 1, 1, 2, 2, 0, 0],? // 67

? [1, 4, 1, 2, 2, 1, 0, 0],? // 68

? [1, 1, 2, 2, 1, 4, 0, 0],? // 69

? [1, 1, 2, 4, 1, 2, 0, 0],? // 70

? [1, 2, 2, 1, 1, 4, 0, 0],? // 71

? [1, 2, 2, 4, 1, 1, 0, 0],? // 72

? [1, 4, 2, 1, 1, 2, 0, 0],? // 73

? [1, 4, 2, 2, 1, 1, 0, 0],? // 74

? [2, 4, 1, 2, 1, 1, 0, 0],? // 75

? [2, 2, 1, 1, 1, 4, 0, 0],? // 76

? [4, 1, 3, 1, 1, 1, 0, 0],? // 77

? [2, 4, 1, 1, 1, 2, 0, 0],? // 78

? [1, 3, 4, 1, 1, 1, 0, 0],? // 79

? [1, 1, 1, 2, 4, 2, 0, 0],? // 80

? [1, 2, 1, 1, 4, 2, 0, 0],? // 81

? [1, 2, 1, 2, 4, 1, 0, 0],? // 82

? [1, 1, 4, 2, 1, 2, 0, 0],? // 83

? [1, 2, 4, 1, 1, 2, 0, 0],? // 84

? [1, 2, 4, 2, 1, 1, 0, 0],? // 85

? [4, 1, 1, 2, 1, 2, 0, 0],? // 86

? [4, 2, 1, 1, 1, 2, 0, 0],? // 87

? [4, 2, 1, 2, 1, 1, 0, 0],? // 88

? [2, 1, 2, 1, 4, 1, 0, 0],? // 89

? [2, 1, 4, 1, 2, 1, 0, 0],? // 90

? [4, 1, 2, 1, 2, 1, 0, 0],? // 91

? [1, 1, 1, 1, 4, 3, 0, 0],? // 92

? [1, 1, 1, 3, 4, 1, 0, 0],? // 93

? [1, 3, 1, 1, 4, 1, 0, 0],? // 94

? [1, 1, 4, 1, 1, 3, 0, 0],? // 95

? [1, 1, 4, 3, 1, 1, 0, 0],? // 96

? [4, 1, 1, 1, 1, 3, 0, 0],? // 97

? [4, 1, 1, 3, 1, 1, 0, 0],? // 98

? [1, 1, 3, 1, 4, 1, 0, 0],? // 99

? [1, 1, 4, 1, 3, 1, 0, 0],? // 100

? [3, 1, 1, 1, 4, 1, 0, 0],? // 101

? [4, 1, 1, 1, 3, 1, 0, 0],? // 102

? [2, 1, 1, 4, 1, 2, 0, 0],? // 103

? [2, 1, 1, 2, 1, 4, 0, 0],? // 104

? [2, 1, 1, 2, 3, 2, 0, 0],? // 105

? [2, 3, 3, 1, 1, 1, 2, 0]? // 106

]

2.index.js中復(fù)制以下代碼:

var barcode = require('./barcode');

function convert_length(length) {

? ? return Math.round(wx.getSystemInfoSync().windowWidth * length / 750);

}

function barc(id, code, width, height) {

? ? barcode.code128(wx.createCanvasContext(id), code, convert_length(width), convert_length(height))

}

module.exports = {

? ? barcode: barc

}

3.wxml中添加代碼:


4.js中添加代碼:


注意在設(shè)置條碼的寬的時候一定要剛好合適,不然會不能掃描或者不容易掃描,調(diào)動寬度的時候要根據(jù)code的位數(shù)來調(diào)整。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容