第一步创建一个barCode.js
直接copy这段代码,每日cv
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
}
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;
}
function code128 (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];
for (var bar = 0; bar < 8; bar += 2) {
var barW = PATTERNS[c][bar] * barWeight;
var barH = height - y;
var spcW = PATTERNS[c][bar + 1] * barWeight;
if (barW > 0) {
g.fillFgRect(x, y, barW, barH);
}
x += barW + spcW;
}
}
}
function stringToCode128(text) {
var barc = {
currcs: CODESET.C
};
var bytes = getBytes(text);
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);
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];
if (b1 in REPLACE_CODES) {
codes.push(REPLACE_CODES[b1]);
i++
b1 = bytes[i];
}
var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;
codes = codes.concat(codesForChar(b1, b2, barc.currcs));
if (barc.currcs == CODESET.C) i++;
}
var checksum = codes[0];
for (var weight = 1; weight < codes.length; weight++) {
checksum += (weight * codes[weight]);
}
codes.push(checksum % 103);
codes.push(SET_STOP);
return codes;
function getBestStartSet(csa1, csa2) {
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;
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;
}
return CODESET.C;
}
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)) {
if (charCompatible(chr2, CODESET.A)) {
shifter = SET_CODEA;
currcs = CODESET.A;
}
else {
shifter = SET_CODEB;
currcs = CODESET.B;
}
}
}
}
else {
if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
switch (currcs) {
case CODESET.A:
shifter = SET_CODEB;
currcs = CODESET.B;
break;
case CODESET.B:
shifter = SET_CODEA;
currcs = CODESET.A;
break;
}
}
else {
shifter = SET_SHIFT;
}
}
if (shifter != -1) {
result.push(shifter);
result.push(codeValue(chr1));
}
else {
if (currcs == CODESET.C) {
result.push(codeValue(chr1, chr2));
}
else {
result.push(codeValue(chr1));
}
}
barc.currcs = currcs;
return result;
}
}
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 (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) {
return CODESET.ANY;
}
else if (chr >= 32 && chr <= 95) {
return CODESET.AB;
}
else {
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";
this.fillBgRect(0, 0, width, height);
this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);
}
Graphics.prototype._fillRect = function (x, y, width, height, color) {
this.ctx.fillStyle = 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],
[2, 2, 2, 1, 2, 2, 0, 0],
[2, 2, 2, 2, 2, 1, 0, 0],
[1, 2, 1, 2, 2, 3, 0, 0],
[1, 2, 1, 3, 2, 2, 0, 0],
[1, 3, 1, 2, 2, 2, 0, 0],
[1, 2, 2, 2, 1, 3, 0, 0],
[1, 2, 2, 3, 1, 2, 0, 0],
[1, 3, 2, 2, 1, 2, 0, 0],
[2, 2, 1, 2, 1, 3, 0, 0],
[2, 2, 1, 3, 1, 2, 0, 0],
[2, 3, 1, 2, 1, 2, 0, 0],
[1, 1, 2, 2, 3, 2, 0, 0],
[1, 2, 2, 1, 3, 2, 0, 0],
[1, 2, 2, 2, 3, 1, 0, 0],
[1, 1, 3, 2, 2, 2, 0, 0],
[1, 2, 3, 1, 2, 2, 0, 0],
[1, 2, 3, 2, 2, 1, 0, 0],
[2, 2, 3, 2, 1, 1, 0, 0],
[2, 2, 1, 1, 3, 2, 0, 0],
[2, 2, 1, 2, 3, 1, 0, 0],
[2, 1, 3, 2, 1, 2, 0, 0],
[2, 2, 3, 1, 1, 2, 0, 0],
[3, 1, 2, 1, 3, 1, 0, 0],
[3, 1, 1, 2, 2, 2, 0, 0],
[3, 2, 1, 1, 2, 2, 0, 0],
[3, 2, 1, 2, 2, 1, 0, 0],
[3, 1, 2, 2, 1, 2, 0, 0],
[3, 2, 2, 1, 1, 2, 0, 0],
[3, 2, 2, 2, 1, 1, 0, 0],
[2, 1, 2, 1, 2, 3, 0, 0],
[2, 1, 2, 3, 2, 1, 0, 0],
[2, 3, 2, 1, 2, 1, 0, 0],
[1, 1, 1, 3, 2, 3, 0, 0],
[1, 3, 1, 1, 2, 3, 0, 0],
[1, 3, 1, 3, 2, 1, 0, 0],
[1, 1, 2, 3, 1, 3, 0, 0],
[1, 3, 2, 1, 1, 3, 0, 0],
[1, 3, 2, 3, 1, 1, 0, 0],
[2, 1, 1, 3, 1, 3, 0, 0],
[2, 3, 1, 1, 1, 3, 0, 0],
[2, 3, 1, 3, 1, 1, 0, 0],
[1, 1, 2, 1, 3, 3, 0, 0],
[1, 1, 2, 3, 3, 1, 0, 0],
[1, 3, 2, 1, 3, 1, 0, 0],
[1, 1, 3, 1, 2, 3, 0, 0],
[1, 1, 3, 3, 2, 1, 0, 0],
[1, 3, 3, 1, 2, 1, 0, 0],
[3, 1, 3, 1, 2, 1, 0, 0],
[2, 1, 1, 3, 3, 1, 0, 0],
[2, 3, 1, 1, 3, 1, 0, 0],
[2, 1, 3, 1, 1, 3, 0, 0],
[2, 1, 3, 3, 1, 1, 0, 0],
[2, 1, 3, 1, 3, 1, 0, 0],
[3, 1, 1, 1, 2, 3, 0, 0],
[3, 1, 1, 3, 2, 1, 0, 0],
[3, 3, 1, 1, 2, 1, 0, 0],
[3, 1, 2, 1, 1, 3, 0, 0],
[3, 1, 2, 3, 1, 1, 0, 0],
[3, 3, 2, 1, 1, 1, 0, 0],
[3, 1, 4, 1, 1, 1, 0, 0],
[2, 2, 1, 4, 1, 1, 0, 0],
[4, 3, 1, 1, 1, 1, 0, 0],
[1, 1, 1, 2, 2, 4, 0, 0],
[1, 1, 1, 4, 2, 2, 0, 0],
[1, 2, 1, 1, 2, 4, 0, 0],
[1, 2, 1, 4, 2, 1, 0, 0],
[1, 4, 1, 1, 2, 2, 0, 0],
[1, 4, 1, 2, 2, 1, 0, 0],
[1, 1, 2, 2, 1, 4, 0, 0],
[1, 1, 2, 4, 1, 2, 0, 0],
[1, 2, 2, 1, 1, 4, 0, 0],
[1, 2, 2, 4, 1, 1, 0, 0],
[1, 4, 2, 1, 1, 2, 0, 0],
[1, 4, 2, 2, 1, 1, 0, 0],
[2, 4, 1, 2, 1, 1, 0, 0],
[2, 2, 1, 1, 1, 4, 0, 0],
[4, 1, 3, 1, 1, 1, 0, 0],
[2, 4, 1, 1, 1, 2, 0, 0],
[1, 3, 4, 1, 1, 1, 0, 0],
[1, 1, 1, 2, 4, 2, 0, 0],
[1, 2, 1, 1, 4, 2, 0, 0],
[1, 2, 1, 2, 4, 1, 0, 0],
[1, 1, 4, 2, 1, 2, 0, 0],
[1, 2, 4, 1, 1, 2, 0, 0],
[1, 2, 4, 2, 1, 1, 0, 0],
[4, 1, 1, 2, 1, 2, 0, 0],
[4, 2, 1, 1, 1, 2, 0, 0],
[4, 2, 1, 2, 1, 1, 0, 0],
[2, 1, 2, 1, 4, 1, 0, 0],
[2, 1, 4, 1, 2, 1, 0, 0],
[4, 1, 2, 1, 2, 1, 0, 0],
[1, 1, 1, 1, 4, 3, 0, 0],
[1, 1, 1, 3, 4, 1, 0, 0],
[1, 3, 1, 1, 4, 1, 0, 0],
[1, 1, 4, 1, 1, 3, 0, 0],
[1, 1, 4, 3, 1, 1, 0, 0],
[4, 1, 1, 1, 1, 3, 0, 0],
[4, 1, 1, 3, 1, 1, 0, 0],
[1, 1, 3, 1, 4, 1, 0, 0],
[1, 1, 4, 1, 3, 1, 0, 0],
[3, 1, 1, 1, 4, 1, 0, 0],
[4, 1, 1, 1, 3, 1, 0, 0],
[2, 1, 1, 4, 1, 2, 0, 0],
[2, 1, 1, 2, 1, 4, 0, 0],
[2, 1, 1, 2, 3, 2, 0, 0],
[2, 3, 3, 1, 1, 1, 2, 0]
]
function convert_length(length) {
return Math.round(wx.getSystemInfoSync().windowWidth * length / 750);
}
function barc(context, code, width, height) {
code128(context, code, convert_length(width), convert_length(height))
}
module.exports = {
barcode: barc
}
第二步创建一个条形码组件,在组件中引用上面创建的barCode.js
使用canvas标签并开启canvas2d
<template>
<canvas
type="2d"
id="barcode"
canvas-id="barcode"
></canvas>
</template>
生成条形码
import BarCode from './barCode';
export default {
props: {
width: {
type: Number,
default: 440,
},
height: {
type: Number,
default: 180,
},
content: {
type: String,
default: '',
},
},
data() { return {} },
created() {
createBarcode();
},
methods: {
createBarcode() {
if (!this.content) return;
const query = wx.createSelectorQuery().in(this);
query
.select('#barcode')
.fields({
node: true,
size: true,
})
.exec((res) => {
const canvas = res[0]?.node;
if (!canvas) return;
const context = canvas.getContext('2d');
const dpr = wx.getSystemInfoSync().pixelRatio;
canvas.width = res[0].width * dpr;
canvas.height = res[0].height * dpr;
context.scale(dpr, dpr);
BarCode.barcode(context, this.content, this.height, this.width);
});
},
}
}
样式,可自己调整canvas大小
<style lang="scss" scoped>
#barcode {
display: block;
height: 134rpx;
width: 512rpx;
margin-left: 50rpx;
position: relative;
z-index: 1;
}
</style>