js生成二维码
首先引入qrcode.js文件(请大家耐心翻到最后):
/*from tccdn minify at 2014-6-4 14:59:43,file��/cn/c/c/qrcode.js*/
/**
* @fileoverview
* - Using the ‘QRCode for Javascript library’
* - Fixed dataset of ‘QRCode for Javascript library’ for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see http://www.d-project.com/
* @see http://jeromeetienne.github.com/jquery-qrcode/
*/
var QRCode;
(function () {
//——————————————————————————————————-
// QRCode for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
// http://www.opensource.org/licenses/mit-license.php
//
// The word “QR Code” is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//——————————————————————————————————-
function QR8bitByte(data) {
this.mode = QRMode.MODE_8BIT_BYTE;
this.data = data;
this.parsedData = [];
// Added to support UTF-8 Characters
for (var i = 0, l = this.data.length; i < l; i++) \{
var byteArray = \[\];
var code = this.data.charCodeAt(i);
if (code > 0x10000) \{
byteArray\[0\] = 0xF0 | ((code & 0x1C0000) >>> 18);
byteArray\[1\] = 0x80 | ((code & 0x3F000) >>> 12);
byteArray\[2\] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray\[3\] = 0x80 | (code & 0x3F);
\} else if (code > 0x800) \{
byteArray\[0\] = 0xE0 | ((code & 0xF000) >>> 12);
byteArray\[1\] = 0x80 | ((code & 0xFC0) >>> 6);
byteArray\[2\] = 0x80 | (code & 0x3F);
\} else if (code > 0x80) \{
byteArray\[0\] = 0xC0 | ((code & 0x7C0) >>> 6);
byteArray\[1\] = 0x80 | (code & 0x3F);
\} else \{
byteArray\[0\] = code;
\}
this.parsedData.push(byteArray);
\}
this.parsedData = Array.prototype.concat.apply(\[\], this.parsedData);
if (this.parsedData.length != this.data.length) \{
this.parsedData.unshift(191);
this.parsedData.unshift(187);
this.parsedData.unshift(239);
\}
\}
QR8bitByte.prototype = \{
getLength: function (buffer) \{
return this.parsedData.length;
\},
write: function (buffer) \{
for (var i = 0, l = this.parsedData.length; i < l; i++) \{
buffer.put(this.parsedData\[i\], 8);
\}
\}
\};
function QRCodeModel(typeNumber, errorCorrectLevel) \{
this.typeNumber = typeNumber;
this.errorCorrectLevel = errorCorrectLevel;
this.modules = null;
this.moduleCount = 0;
this.dataCache = null;
this.dataList = \[\];
\}
function QRPolynomial(num, shift) {
if (num.length == undefined) throw new Error(num.length + “/“ + shift);
var offset = 0;
while (offset < num.length && num[offset] == 0) offset++;
this.num = new Array(num.length - offset + shift);
for (var i = 0; i < num.length - offset; i++) this.num[i] = num[i + offset];
}
function QRRSBlock(totalCount, dataCount) {
this.totalCount = totalCount, this.dataCount = dataCount;
}
function QRBitBuffer() {
this.buffer = [], this.length = 0;
}
QRCodeModel.prototype = \{
"addData": function(data) \{
var newData = new QR8bitByte(data);
this.dataList.push(newData), this.dataCache = null;
\},
"isDark": function(row, col) \{
if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) throw new Error(row + "," + col);
return this.modules\[row\]\[col\];
\},
"getModuleCount": function() \{
return this.moduleCount;
\},
"make": function() \{
this.makeImpl(!1, this.getBestMaskPattern());
\},
"makeImpl": function(test, maskPattern) \{
this.moduleCount = this.typeNumber \* 4 + 17, this.modules = new Array(this.moduleCount);
for (var row = 0; row < this.moduleCount; row++) \{
this.modules\[row\] = new Array(this.moduleCount);
for (var col = 0; col < this.moduleCount; col++) this.modules\[row\]\[col\] = null;
\}
this.setupPositionProbePattern(0, 0),
this.setupPositionProbePattern(this.moduleCount - 7, 0),
this.setupPositionProbePattern(0, this.moduleCount - 7),
this.setupPositionAdjustPattern(), this.setupTimingPattern(),
this.setupTypeInfo(test, maskPattern),
this.typeNumber >= 7 && this.setupTypeNumber(test),
this.dataCache == null && (this.dataCache = QRCodeModel.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)), this.mapData(this.dataCache, maskPattern);
\},
"setupPositionProbePattern": function(row, col) \{
for (var r = -1; r <= 7; r++) \{
if (row + r <= -1 || this.moduleCount <= row + r) continue;
for (var c = -1; c <= 7; c++) \{
if (col + c <= -1 || this.moduleCount <= col + c) continue;
0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4 ? this.modules[row + r][col + c] = !0 : this.modules[row + r][col + c] = !1;
}
}
},
“getBestMaskPattern”: function() {
var minLostPoint = 0, pattern = 0;
for (var i = 0; i < 8; i++) {
this.makeImpl(!0, i);
var lostPoint = QRUtil.getLostPoint(this);
if (i == 0 || minLostPoint > lostPoint) minLostPoint = lostPoint, pattern = i;
}
return pattern;
},
“createMovieClip”: function(target_mc, instance_name, depth) {
var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth), cs = 1;
this.make();
for (var row = 0; row < this.modules.length; row++) {
var y = row * cs;
for (var col = 0; col < this.modules[row].length; col++) {
var x = col * cs, dark = this.modules[row][col];
dark && (qr_mc.beginFill(0, 100), qr_mc.moveTo(x, y), qr_mc.lineTo(x + cs, y), qr_mc.lineTo(x + cs, y + cs), qr_mc.lineTo(x, y + cs), qr_mc.endFill());
}
}
return qr_mc;
},
“setupTimingPattern”: function() {
for (var r = 8; r < this.moduleCount - 8; r++) {
if (this.modules[r][6] != null) continue;
this.modules[r][6] = r % 2 == 0;
}
for (var c = 8; c < this.moduleCount - 8; c++) {
if (this.modules[6][c] != null) continue;
this.modules[6][c] = c % 2 == 0;
}
},
“setupPositionAdjustPattern”: function() {
var pos = QRUtil.getPatternPosition(this.typeNumber);
for (var i = 0; i < pos.length; i++) for (var j = 0; j < pos.length; j++) {
var row = pos[i], col = pos[j];
if (this.modules[row][col] != null) continue;
for (var r = -2; r <= 2; r++) for (var c = -2; c <= 2; c++) r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0 ? this.modules[row + r][col + c] = !0 : this.modules[row + r][col + c] = !1;
}
},
“setupTypeNumber”: function(test) {
var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
for (var i = 0; i < 18; i++) {
var mod = !test && (bits >> i & 1) == 1;
this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
}
for (var i = 0; i < 18; i++) {
var mod = !test && (bits >> i & 1) == 1;
this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
}
},
“setupTypeInfo”: function(test, maskPattern) {
var data = this.errorCorrectLevel << 3 | maskPattern, bits = QRUtil.getBCHTypeInfo(data);
for (var i = 0; i < 15; i++) {
var mod = !test && (bits >> i & 1) == 1;
i < 6 ? this.modules[i][8] = mod : i < 8 ? this.modules[i + 1][8] = mod : this.modules[this.moduleCount - 15 + i][8] = mod;
}
for (var i = 0; i < 15; i++) {
var mod = !test && (bits >> i & 1) == 1;
i < 8 ? this.modules[8][this.moduleCount - i - 1] = mod : i < 9 ? this.modules[8][15 - i - 1 + 1] = mod : this.modules[8][15 - i - 1] = mod;
}
this.modules[this.moduleCount - 8][8] = !test;
},
“mapData”: function(data, maskPattern) {
var inc = -1, row = this.moduleCount - 1, bitIndex = 7, byteIndex = 0;
for (var col = this.moduleCount - 1; col > 0; col -= 2) {
col == 6 && col—;
for (;;) {
for (var c = 0; c < 2; c++) if (this.modules[row][col - c] == null) {
var dark = !1;
byteIndex < data.length && (dark = (data[byteIndex] >>> bitIndex & 1) == 1);
var mask = QRUtil.getMask(maskPattern, row, col - c);
mask && (dark = !dark), this.modules[row][col - c] = dark, bitIndex—, bitIndex == -1 && (byteIndex++, bitIndex = 7);
}
row += inc;
if (row < 0 || this.moduleCount <= row) {
row -= inc, inc = -inc;
break;
}
}
}
}
}, QRCodeModel.PAD0 = 236, QRCodeModel.PAD1 = 17, QRCodeModel.createData = function(typeNumber, errorCorrectLevel, dataList) {
var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel), buffer = new QRBitBuffer;
for (var i = 0; i < dataList.length; i++) {
var data = dataList[i];
buffer.put(data.mode, 4), buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)), data.write(buffer);
}
var totalDataCount = 0;
for (var i = 0; i < rsBlocks.length; i++) totalDataCount += rsBlocks[i].dataCount;
if (buffer.getLengthInBits() > totalDataCount * 8) throw new Error(“code length overflow. (“ + buffer.getLengthInBits() + “>” + totalDataCount * 8 + “)”);
buffer.getLengthInBits() + 4 <= totalDataCount * 8 && buffer.put(0, 4);
while (buffer.getLengthInBits() % 8 != 0) buffer.putBit(!1);
for (;;) {
if (buffer.getLengthInBits() >= totalDataCount * 8) break;
buffer.put(QRCodeModel.PAD0, 8);
if (buffer.getLengthInBits() >= totalDataCount * 8) break;
buffer.put(QRCodeModel.PAD1, 8);
}
return QRCodeModel.createBytes(buffer, rsBlocks);
}, QRCodeModel.createBytes = function(buffer, rsBlocks) {
var offset = 0, maxDcCount = 0, maxEcCount = 0, dcdata = new Array(rsBlocks.length), ecdata = new Array(rsBlocks.length);
for (var r = 0; r < rsBlocks.length; r++) {
var dcCount = rsBlocks[r].dataCount, ecCount = rsBlocks[r].totalCount - dcCount;
maxDcCount = Math.max(maxDcCount, dcCount), maxEcCount = Math.max(maxEcCount, ecCount), dcdata[r] = new Array(dcCount);
for (var i = 0; i < dcdata[r].length; i++) dcdata[r][i] = 255 & buffer.buffer[i + offset];
offset += dcCount;
var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount), rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1), modPoly = rawPoly.mod(rsPoly);
ecdata[r] = new Array(rsPoly.getLength() - 1);
for (var i = 0; i < ecdata[r].length; i++) {
var modIndex = i + modPoly.getLength() - ecdata[r].length;
ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
}
}
var totalCodeCount = 0;
for (var i = 0; i < rsBlocks.length; i++) totalCodeCount += rsBlocks[i].totalCount;
var data = new Array(totalCodeCount), index = 0;
for (var i = 0; i < maxDcCount; i++) for (var r = 0; r < rsBlocks.length; r++) i < dcdata[r].length && (data[index++] = dcdata[r][i]);
for (var i = 0; i < maxEcCount; i++) for (var r = 0; r < rsBlocks.length; r++) i < ecdata[r].length && (data[index++] = ecdata[r][i]);
return data;
};
var QRMode = \{
"MODE\_NUMBER": 1,
"MODE\_ALPHA\_NUM": 2,
"MODE\_8BIT\_BYTE": 4,
"MODE\_KANJI": 8
\}, QRErrorCorrectLevel = \{
"L": 1,
"M": 0,
"Q": 3,
"H": 2
\}, QRMaskPattern = \{
"PATTERN000": 0,
"PATTERN001": 1,
"PATTERN010": 2,
"PATTERN011": 3,
"PATTERN100": 4,
"PATTERN101": 5,
"PATTERN110": 6,
"PATTERN111": 7
\}, QRUtil = \{
"PATTERN\_POSITION\_TABLE": \[ \[\], \[ 6, 18 \], \[ 6, 22 \], \[ 6, 26 \], \[ 6, 30 \], \[ 6, 34 \], \[ 6, 22, 38 \], \[ 6, 24, 42 \], \[ 6, 26, 46 \], \[ 6, 28, 50 \], \[ 6, 30, 54 \], \[ 6, 32, 58 \], \[ 6, 34, 62 \], \[ 6, 26, 46, 66 \], \[ 6, 26, 48, 70 \], \[ 6, 26, 50, 74 \], \[ 6, 30, 54, 78 \], \[ 6, 30, 56, 82 \], \[ 6, 30, 58, 86 \], \[ 6, 34, 62, 90 \], \[ 6, 28, 50, 72, 94 \], \[ 6, 26, 50, 74, 98 \], \[ 6, 30, 54, 78, 102 \], \[ 6, 28, 54, 80, 106 \], \[ 6, 32, 58, 84, 110 \], \[ 6, 30, 58, 86, 114 \], \[ 6, 34, 62, 90, 118 \], \[ 6, 26, 50, 74, 98, 122 \], \[ 6, 30, 54, 78, 102, 126 \], \[ 6, 26, 52, 78, 104, 130 \], \[ 6, 30, 56, 82, 108, 134 \], \[ 6, 34, 60, 86, 112, 138 \], \[ 6, 30, 58, 86, 114, 142 \], \[ 6, 34, 62, 90, 118, 146 \], \[ 6, 30, 54, 78, 102, 126, 150 \], \[ 6, 24, 50, 76, 102, 128, 154 \], \[ 6, 28, 54, 80, 106, 132, 158 \], \[ 6, 32, 58, 84, 110, 136, 162 \], \[ 6, 26, 54, 82, 110, 138, 166 \], \[ 6, 30, 58, 86, 114, 142, 170 \] \],
"G15": 1335,
"G18": 7973,
"G15\_MASK": 21522,
"getBCHTypeInfo": function(data) \{
var d = data << 10;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15);
return (data << 10 | d) ^ QRUtil.G15\_MASK;
\},
"getBCHTypeNumber": function(data) \{
var d = data << 12;
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18);
return data << 12 | d;
\},
"getBCHDigit": function(data) \{
var digit = 0;
while (data != 0) digit++, data >>>= 1;
return digit;
\},
"getPatternPosition": function(typeNumber) \{
return QRUtil.PATTERN\_POSITION\_TABLE\[typeNumber - 1\];
\},
"getMask": function(maskPattern, i, j) \{
switch (maskPattern) \{
case QRMaskPattern.PATTERN000:
return (i + j) % 2 == 0;
case QRMaskPattern.PATTERN001:
return i % 2 == 0;
case QRMaskPattern.PATTERN010:
return j % 3 == 0;
case QRMaskPattern.PATTERN011:
return (i + j) % 3 == 0;
case QRMaskPattern.PATTERN100:
return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
case QRMaskPattern.PATTERN101:
return i \* j % 2 + i \* j % 3 == 0;
case QRMaskPattern.PATTERN110:
return (i \* j % 2 + i \* j % 3) % 2 == 0;
case QRMaskPattern.PATTERN111:
return (i \* j % 3 + (i + j) % 2) % 2 == 0;
default:
throw new Error("bad maskPattern:" + maskPattern);
\}
\},
"getErrorCorrectPolynomial": function(errorCorrectLength) \{
var a = new QRPolynomial(\[ 1 \], 0);
for (var i = 0; i < errorCorrectLength; i++) a = a.multiply(new QRPolynomial(\[ 1, QRMath.gexp(i) \], 0));
return a;
\},
"getLengthInBits": function(mode, type) \{
if (1 <= type && type < 10) switch (mode) \{
case QRMode.MODE\_NUMBER:
return 10;
case QRMode.MODE\_ALPHA\_NUM:
return 9;
case QRMode.MODE\_8BIT\_BYTE:
return 8;
case QRMode.MODE\_KANJI:
return 8;
default:
throw new Error("mode:" + mode);
\} else if (type < 27) switch (mode) \{
case QRMode.MODE\_NUMBER:
return 12;
case QRMode.MODE\_ALPHA\_NUM:
return 11;
case QRMode.MODE\_8BIT\_BYTE:
return 16;
case QRMode.MODE\_KANJI:
return 10;
default:
throw new Error("mode:" + mode);
\} else \{
if (!(type < 41)) throw new Error("type:" + type);
switch (mode) \{
case QRMode.MODE\_NUMBER:
return 14;
case QRMode.MODE\_ALPHA\_NUM:
return 13;
case QRMode.MODE\_8BIT\_BYTE:
return 16;
case QRMode.MODE\_KANJI:
return 12;
default:
throw new Error("mode:" + mode);
\}
\}
\},
"getLostPoint": function(qrCode) \{
var moduleCount = qrCode.getModuleCount(), lostPoint = 0;
for (var row = 0; row < moduleCount; row++) for (var col = 0; col < moduleCount; col++) \{
var sameCount = 0, dark = qrCode.isDark(row, col);
for (var r = -1; r <= 1; r++) \{
if (row + r < 0 || moduleCount <= row + r) continue;
for (var c = -1; c <= 1; c++) \{
if (col + c < 0 || moduleCount <= col + c) continue;
if (r == 0 && c == 0) continue;
dark == qrCode.isDark(row + r, col + c) && sameCount++;
\}
\}
sameCount > 5 && (lostPoint += 3 + sameCount - 5);
\}
for (var row = 0; row < moduleCount - 1; row++) for (var col = 0; col < moduleCount - 1; col++) \{
var count = 0;
qrCode.isDark(row, col) && count++, qrCode.isDark(row + 1, col) && count++, qrCode.isDark(row, col + 1) && count++, qrCode.isDark(row + 1, col + 1) && count++;
if (count == 0 || count == 4) lostPoint += 3;
\}
for (var row = 0; row < moduleCount; row++) for (var col = 0; col < moduleCount - 6; col++) qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6) && (lostPoint += 40);
for (var col = 0; col < moduleCount; col++) for (var row = 0; row < moduleCount - 6; row++) qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col) && (lostPoint += 40);
var darkCount = 0;
for (var col = 0; col < moduleCount; col++) for (var row = 0; row < moduleCount; row++) qrCode.isDark(row, col) && darkCount++;
var ratio = Math.abs(100 \* darkCount / moduleCount / moduleCount - 50) / 5;
return lostPoint += ratio \* 10, lostPoint;
\}
\}, QRMath = \{
"glog": function(n) \{
if (n < 1) throw new Error("glog(" + n + ")");
return QRMath.LOG\_TABLE\[n\];
\},
"gexp": function(n) \{
while (n < 0) n += 255;
while (n >= 256) n -= 255;
return QRMath.EXP\_TABLE\[n\];
\},
"EXP\_TABLE": new Array(256),
"LOG\_TABLE": new Array(256)
\};
for (var i = 0; i < 8; i++) QRMath.EXP\_TABLE\[i\] = 1 << i;
for (var i = 8; i < 256; i++) QRMath.EXP\_TABLE\[i\] = QRMath.EXP\_TABLE\[i - 4\] ^ QRMath.EXP\_TABLE\[i - 5\] ^ QRMath.EXP\_TABLE\[i - 6\] ^ QRMath.EXP\_TABLE\[i - 8\];
for (var i = 0; i < 255; i++) QRMath.LOG\_TABLE\[QRMath.EXP\_TABLE\[i\]\] = i;
QRPolynomial.prototype = \{
"get": function(index) \{
return this.num\[index\];
\},
"getLength": function() \{
return this.num.length;
\},
"multiply": function(e) \{
var num = new Array(this.getLength() + e.getLength() - 1);
for (var i = 0; i < this.getLength(); i++) for (var j = 0; j < e.getLength(); j++) num\[i + j\] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
return new QRPolynomial(num, 0);
\},
"mod": function(e) \{
if (this.getLength() - e.getLength() < 0) return this;
var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)), num = new Array(this.getLength());
for (var i = 0; i < this.getLength(); i++) num\[i\] = this.get(i);
for (var i = 0; i < e.getLength(); i++) num\[i\] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
return (new QRPolynomial(num, 0)).mod(e);
\}
\}, QRRSBlock.RS\_BLOCK\_TABLE = \[ \[ 1, 26, 19 \], \[ 1, 26, 16 \], \[ 1, 26, 13 \], \[ 1, 26, 9 \], \[ 1, 44, 34 \], \[ 1, 44, 28 \], \[ 1, 44, 22 \], \[ 1, 44, 16 \], \[ 1, 70, 55 \], \[ 1, 70, 44 \], \[ 2, 35, 17 \], \[ 2, 35, 13 \], \[ 1, 100, 80 \], \[ 2, 50, 32 \], \[ 2, 50, 24 \], \[ 4, 25, 9 \], \[ 1, 134, 108 \], \[ 2, 67, 43 \], \[ 2, 33, 15, 2, 34, 16 \], \[ 2, 33, 11, 2, 34, 12 \], \[ 2, 86, 68 \], \[ 4, 43, 27 \], \[ 4, 43, 19 \], \[ 4, 43, 15 \], \[ 2, 98, 78 \], \[ 4, 49, 31 \], \[ 2, 32, 14, 4, 33, 15 \], \[ 4, 39, 13, 1, 40, 14 \], \[ 2, 121, 97 \], \[ 2, 60, 38, 2, 61, 39 \], \[ 4, 40, 18, 2, 41, 19 \], \[ 4, 40, 14, 2, 41, 15 \], \[ 2, 146, 116 \], \[ 3, 58, 36, 2, 59, 37 \], \[ 4, 36, 16, 4, 37, 17 \], \[ 4, 36, 12, 4, 37, 13 \], \[ 2, 86, 68, 2, 87, 69 \], \[ 4, 69, 43, 1, 70, 44 \], \[ 6, 43, 19, 2, 44, 20 \], \[ 6, 43, 15, 2, 44, 16 \], \[ 4, 101, 81 \], \[ 1, 80, 50, 4, 81, 51 \], \[ 4, 50, 22, 4, 51, 23 \], \[ 3, 36, 12, 8, 37, 13 \], \[ 2, 116, 92, 2, 117, 93 \], \[ 6, 58, 36, 2, 59, 37 \], \[ 4, 46, 20, 6, 47, 21 \], \[ 7, 42, 14, 4, 43, 15 \], \[ 4, 133, 107 \], \[ 8, 59, 37, 1, 60, 38 \], \[ 8, 44, 20, 4, 45, 21 \], \[ 12, 33, 11, 4, 34, 12 \], \[ 3, 145, 115, 1, 146, 116 \], \[ 4, 64, 40, 5, 65, 41 \], \[ 11, 36, 16, 5, 37, 17 \], \[ 11, 36, 12, 5, 37, 13 \], \[ 5, 109, 87, 1, 110, 88 \], \[ 5, 65, 41, 5, 66, 42 \], \[ 5, 54, 24, 7, 55, 25 \], \[ 11, 36, 12 \], \[ 5, 122, 98, 1, 123, 99 \], \[ 7, 73, 45, 3, 74, 46 \], \[ 15, 43, 19, 2, 44, 20 \], \[ 3, 45, 15, 13, 46, 16 \], \[ 1, 135, 107, 5, 136, 108 \], \[ 10, 74, 46, 1, 75, 47 \], \[ 1, 50, 22, 15, 51, 23 \], \[ 2, 42, 14, 17, 43, 15 \], \[ 5, 150, 120, 1, 151, 121 \], \[ 9, 69, 43, 4, 70, 44 \], \[ 17, 50, 22, 1, 51, 23 \], \[ 2, 42, 14, 19, 43, 15 \], \[ 3, 141, 113, 4, 142, 114 \], \[ 3, 70, 44, 11, 71, 45 \], \[ 17, 47, 21, 4, 48, 22 \], \[ 9, 39, 13, 16, 40, 14 \], \[ 3, 135, 107, 5, 136, 108 \], \[ 3, 67, 41, 13, 68, 42 \], \[ 15, 54, 24, 5, 55, 25 \], \[ 15, 43, 15, 10, 44, 16 \], \[ 4, 144, 116, 4, 145, 117 \], \[ 17, 68, 42 \], \[ 17, 50, 22, 6, 51, 23 \], \[ 19, 46, 16, 6, 47, 17 \], \[ 2, 139, 111, 7, 140, 112 \], \[ 17, 74, 46 \], \[ 7, 54, 24, 16, 55, 25 \], \[ 34, 37, 13 \], \[ 4, 151, 121, 5, 152, 122 \], \[ 4, 75, 47, 14, 76, 48 \], \[ 11, 54, 24, 14, 55, 25 \], \[ 16, 45, 15, 14, 46, 16 \], \[ 6, 147, 117, 4, 148, 118 \], \[ 6, 73, 45, 14, 74, 46 \], \[ 11, 54, 24, 16, 55, 25 \], \[ 30, 46, 16, 2, 47, 17 \], \[ 8, 132, 106, 4, 133, 107 \], \[ 8, 75, 47, 13, 76, 48 \], \[ 7, 54, 24, 22, 55, 25 \], \[ 22, 45, 15, 13, 46, 16 \], \[ 10, 142, 114, 2, 143, 115 \], \[ 19, 74, 46, 4, 75, 47 \], \[ 28, 50, 22, 6, 51, 23 \], \[ 33, 46, 16, 4, 47, 17 \], \[ 8, 152, 122, 4, 153, 123 \], \[ 22, 73, 45, 3, 74, 46 \], \[ 8, 53, 23, 26, 54, 24 \], \[ 12, 45, 15, 28, 46, 16 \], \[ 3, 147, 117, 10, 148, 118 \], \[ 3, 73, 45, 23, 74, 46 \], \[ 4, 54, 24, 31, 55, 25 \], \[ 11, 45, 15, 31, 46, 16 \], \[ 7, 146, 116, 7, 147, 117 \], \[ 21, 73, 45, 7, 74, 46 \], \[ 1, 53, 23, 37, 54, 24 \], \[ 19, 45, 15, 26, 46, 16 \], \[ 5, 145, 115, 10, 146, 116 \], \[ 19, 75, 47, 10, 76, 48 \], \[ 15, 54, 24, 25, 55, 25 \], \[ 23, 45, 15, 25, 46, 16 \], \[ 13, 145, 115, 3, 146, 116 \], \[ 2, 74, 46, 29, 75, 47 \], \[ 42, 54, 24, 1, 55, 25 \], \[ 23, 45, 15, 28, 46, 16 \], \[ 17, 145, 115 \], \[ 10, 74, 46, 23, 75, 47 \], \[ 10, 54, 24, 35, 55, 25 \], \[ 19, 45, 15, 35, 46, 16 \], \[ 17, 145, 115, 1, 146, 116 \], \[ 14, 74, 46, 21, 75, 47 \], \[ 29, 54, 24, 19, 55, 25 \], \[ 11, 45, 15, 46, 46, 16 \], \[ 13, 145, 115, 6, 146, 116 \], \[ 14, 74, 46, 23, 75, 47 \], \[ 44, 54, 24, 7, 55, 25 \], \[ 59, 46, 16, 1, 47, 17 \], \[ 12, 151, 121, 7, 152, 122 \], \[ 12, 75, 47, 26, 76, 48 \], \[ 39, 54, 24, 14, 55, 25 \], \[ 22, 45, 15, 41, 46, 16 \], \[ 6, 151, 121, 14, 152, 122 \], \[ 6, 75, 47, 34, 76, 48 \], \[ 46, 54, 24, 10, 55, 25 \], \[ 2, 45, 15, 64, 46, 16 \], \[ 17, 152, 122, 4, 153, 123 \], \[ 29, 74, 46, 14, 75, 47 \], \[ 49, 54, 24, 10, 55, 25 \], \[ 24, 45, 15, 46, 46, 16 \], \[ 4, 152, 122, 18, 153, 123 \], \[ 13, 74, 46, 32, 75, 47 \], \[ 48, 54, 24, 14, 55, 25 \], \[ 42, 45, 15, 32, 46, 16 \], \[ 20, 147, 117, 4, 148, 118 \], \[ 40, 75, 47, 7, 76, 48 \], \[ 43, 54, 24, 22, 55, 25 \], \[ 10, 45, 15, 67, 46, 16 \], \[ 19, 148, 118, 6, 149, 119 \], \[ 18, 75, 47, 31, 76, 48 \], \[ 34, 54, 24, 34, 55, 25 \], \[ 20, 45, 15, 61, 46, 16 \] \], QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) \{
var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
if (rsBlock == undefined) throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel);
var length = rsBlock.length / 3, list = \[\];
for (var i = 0; i < length; i++) \{
var count = rsBlock\[i \* 3 + 0\], totalCount = rsBlock\[i \* 3 + 1\], dataCount = rsBlock\[i \* 3 + 2\];
for (var j = 0; j < count; j++) list.push(new QRRSBlock(totalCount, dataCount));
\}
return list;
\}, QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) \{
switch (errorCorrectLevel) \{
case QRErrorCorrectLevel.L:
return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 0\];
case QRErrorCorrectLevel.M:
return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 1\];
case QRErrorCorrectLevel.Q:
return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 2\];
case QRErrorCorrectLevel.H:
return QRRSBlock.RS\_BLOCK\_TABLE\[(typeNumber - 1) \* 4 + 3\];
default:
return undefined;
\}
\}, QRBitBuffer.prototype = \{
"get": function(index) \{
var bufIndex = Math.floor(index / 8);
return (this.buffer\[bufIndex\] >>> 7 - index % 8 & 1) == 1;
\},
"put": function(num, length) \{
for (var i = 0; i < length; i++) this.putBit((num >>> length - i - 1 & 1) == 1);
\},
"getLengthInBits": function() \{
return this.length;
\},
"putBit": function(bit) \{
var bufIndex = Math.floor(this.length / 8);
this.buffer.length <= bufIndex && this.buffer.push(0), bit && (this.buffer\[bufIndex\] |= 128 >>> this.length % 8), this.length++;
\}
\};
var QRCodeLimitLength=\[\[17,14,11,7\],\[32,26,20,14\],\[53,42,32,24\],\[78,62,46,34\],\[106,84,60,44\],\[134,106,74,58\],\[154,122,86,64\],\[192,152,108,84\],\[230,180,130,98\],\[271,213,151,119\],\[321,251,177,137\],\[367,287,203,155\],\[425,331,241,177\],\[458,362,258,194\],\[520,412,292,220\],\[586,450,322,250\],\[644,504,364,280\],\[718,560,394,310\],\[792,624,442,338\],\[858,666,482,382\],\[929,711,509,403\],\[1003,779,565,439\],\[1091,857,611,461\],\[1171,911,661,511\],\[1273,997,715,535\],\[1367,1059,751,593\],\[1465,1125,805,625\],\[1528,1190,868,658\],\[1628,1264,908,698\],\[1732,1370,982,742\],\[1840,1452,1030,790\],\[1952,1538,1112,842\],\[2068,1628,1168,898\],\[2188,1722,1228,958\],\[2303,1809,1283,983\],\[2431,1911,1351,1051\],\[2563,1989,1423,1093\],\[2699,2099,1499,1139\],\[2809,2213,1579,1219\],\[2953,2331,1663,1273\]\];
function \_isSupportCanvas() \{
return typeof CanvasRenderingContext2D != "undefined";
\}
// android 2.x doesn't support Data-URI spec
function \_getAndroid() \{
var android = false;
var sAgent = navigator.userAgent;
if (/android/i.test(sAgent)) \{ // android
android = true;
aMat = sAgent.toString().match(/android (\[0-9\]\\.\[0-9\])/i);
if (aMat && aMat\[1\]) \{
android = parseFloat(aMat\[1\]);
\}
\}
return android;
\}
var svgDrawer = (function() \{
var Drawing = function (el, htOption) \{
this.\_el = el;
this.\_htOption = htOption;
\};
Drawing.prototype.draw = function (oQRCode) \{
var \_htOption = this.\_htOption;
var \_el = this.\_el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(\_htOption.width / nCount);
var nHeight = Math.floor(\_htOption.height / nCount);
this.clear();
function makeSVG(tag, attrs) \{
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
for (var k in attrs)
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs\[k\]);
return el;
\}
var svg = makeSVG("svg" , \{'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': \_htOption.colorLight\});
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
\_el.appendChild(svg);
svg.appendChild(makeSVG("rect", \{"fill": \_htOption.colorDark, "width": "1", "height": "1", "id": "template"\}));
for (var row = 0; row < nCount; row++) \{
for (var col = 0; col < nCount; col++) \{
if (oQRCode.isDark(row, col)) \{
var child = makeSVG("use", \{"x": String(row), "y": String(col)\});
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "\#template")
svg.appendChild(child);
\}
\}
\}
\};
Drawing.prototype.clear = function () \{
while (this.\_el.hasChildNodes())
this.\_el.removeChild(this.\_el.lastChild);
\};
return Drawing;
\})();
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
// Drawing in DOM by using Table tag
var Drawing = useSVG ? svgDrawer : !\_isSupportCanvas() ? (function () \{
var Drawing = function (el, htOption) \{
this.\_el = el;
this.\_htOption = htOption;
\};
/\*\*
\* Draw the QRCode
\*
\* @param \{QRCode\} oQRCode
\*/
Drawing.prototype.draw = function (oQRCode) \{
var \_htOption = this.\_htOption;
var \_el = this.\_el;
var nCount = oQRCode.getModuleCount();
var nWidth = Math.floor(\_htOption.width / nCount);
var nHeight = Math.floor(\_htOption.height / nCount);
var aHTML = \['<table style="border:0;border-collapse:collapse;">'\];
for (var row = 0; row < nCount; row++) \{
aHTML.push('<tr>');
for (var col = 0; col < nCount; col++) \{
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? \_htOption.colorDark : \_htOption.colorLight) + ';"></td>');
\}
aHTML.push('</tr>');
\}
aHTML.push('</table>');
\_el.innerHTML = aHTML.join('');
// Fix the margin values as real size.
var elTable = \_el.childNodes\[0\];
var nLeftMarginTable = (\_htOption.width - elTable.offsetWidth) / 2;
var nTopMarginTable = (\_htOption.height - elTable.offsetHeight) / 2;
if (nLeftMarginTable > 0 && nTopMarginTable > 0) \{
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
\}
\};
/\*\*
\* Clear the QRCode
\*/
Drawing.prototype.clear = function () \{
this.\_el.innerHTML = '';
\};
return Drawing;
\})() : (function () \{ // Drawing in Canvas
function \_onMakeImage() \{
this.\_elImage.src = this.\_elCanvas.toDataURL("image/png");
this.\_elImage.style.display = "block";
this.\_elCanvas.style.display = "none";
\}
// Android 2.1 bug workaround
// http://code.google.com/p/android/issues/detail?id=5141
if (this.\_android && this.\_android <= 2.1) \{
var factor = 1 / window.devicePixelRatio;
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) \{
if (("nodeName" in image) && /img/i.test(image.nodeName)) \{
for (var i = arguments.length - 1; i >= 1; i--) \{
arguments\[i\] = arguments\[i\] \* factor;
\}
\} else if (typeof dw == "undefined") \{
arguments\[1\] \*= factor;
arguments\[2\] \*= factor;
arguments\[3\] \*= factor;
arguments\[4\] \*= factor;
\}
drawImage.apply(this, arguments);
\};
\}
/\*\*
\* Check whether the user's browser supports Data URI or not
\*
\* @private
\* @param \{Function\} fSuccess Occurs if it supports Data URI
\* @param \{Function\} fFail Occurs if it doesn't support Data URI
\*/
function \_safeSetDataURI(fSuccess, fFail) \{
var self = this;
self.\_fFail = fFail;
self.\_fSuccess = fSuccess;
// Check it just once
if (self.\_bSupportDataURI === null) \{
var el = document.createElement("img");
var fOnError = function() \{
self.\_bSupportDataURI = false;
if (self.\_fFail) \{
\_fFail.call(self);
\}
\};
var fOnSuccess = function() \{
self.\_bSupportDataURI = true;
if (self.\_fSuccess) \{
self.\_fSuccess.call(self);
\}
\};
el.onabort = fOnError;
el.onerror = fOnError;
el.onload = fOnSuccess;
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
return;
\} else if (self.\_bSupportDataURI === true && self.\_fSuccess) \{
self.\_fSuccess.call(self);
\} else if (self.\_bSupportDataURI === false && self.\_fFail) \{
self.\_fFail.call(self);
\}
\};
/\*\*
\* Drawing QRCode by using canvas
\*
\* @constructor
\* @param \{HTMLElement\} el
\* @param \{Object\} htOption QRCode Options
\*/
var Drawing = function (el, htOption) \{
this.\_bIsPainted = false;
this.\_android = \_getAndroid();
this.\_htOption = htOption;
this.\_elCanvas = document.createElement("canvas");
this.\_elCanvas.width = htOption.width;
this.\_elCanvas.height = htOption.height;
el.appendChild(this.\_elCanvas);
this.\_el = el;
this.\_oContext = this.\_elCanvas.getContext("2d");
this.\_bIsPainted = false;
this.\_elImage = document.createElement("img");
this.\_elImage.alt = "Scan me!";
this.\_elImage.style.display = "none";
this.\_el.appendChild(this.\_elImage);
this.\_bSupportDataURI = null;
\};
/\*\*
\* Draw the QRCode
\*
\* @param \{QRCode\} oQRCode
\*/
Drawing.prototype.draw = function (oQRCode) \{
var \_elImage = this.\_elImage;
var \_oContext = this.\_oContext;
var \_htOption = this.\_htOption;
var nCount = oQRCode.getModuleCount();
var nWidth = \_htOption.width / nCount;
var nHeight = \_htOption.height / nCount;
var nRoundedWidth = Math.round(nWidth);
var nRoundedHeight = Math.round(nHeight);
\_elImage.style.display = "none";
this.clear();
for (var row = 0; row < nCount; row++) \{
for (var col = 0; col < nCount; col++) \{
var bIsDark = oQRCode.isDark(row, col);
var nLeft = col \* nWidth;
var nTop = row \* nHeight;
\_oContext.strokeStyle = bIsDark ? \_htOption.colorDark : \_htOption.colorLight;
\_oContext.lineWidth = 1;
\_oContext.fillStyle = bIsDark ? \_htOption.colorDark : \_htOption.colorLight;
\_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
// ?? ???? ?? ??
\_oContext.strokeRect(
Math.floor(nLeft) + 0.5,
Math.floor(nTop) + 0.5,
nRoundedWidth,
nRoundedHeight
);
\_oContext.strokeRect(
Math.ceil(nLeft) - 0.5,
Math.ceil(nTop) - 0.5,
nRoundedWidth,
nRoundedHeight
);
\}
\}
this.\_bIsPainted = true;
\};
/\*\*
\* Make the image from Canvas if the browser supports Data URI.
\*/
Drawing.prototype.makeImage = function () \{
if (this.\_bIsPainted) \{
\_safeSetDataURI.call(this, \_onMakeImage);
\}
\};
/\*\*
\* Return whether the QRCode is painted or not
\*
\* @return \{Boolean\}
\*/
Drawing.prototype.isPainted = function () \{
return this.\_bIsPainted;
\};
/\*\*
\* Clear the QRCode
\*/
Drawing.prototype.clear = function () \{
this.\_oContext.clearRect(0, 0, this.\_elCanvas.width, this.\_elCanvas.height);
this.\_bIsPainted = false;
\};
/\*\*
\* @private
\* @param \{Number\} nNumber
\*/
Drawing.prototype.round = function (nNumber) \{
if (!nNumber) \{
return nNumber;
\}
return Math.floor(nNumber \* 1000) / 1000;
\};
return Drawing;
\})();
/\*\*
\* Get the type by string length
\*
\* @private
\* @param \{String\} sText
\* @param \{Number\} nCorrectLevel
\* @return \{Number\} type
\*/
function \_getTypeNumber(sText, nCorrectLevel) \{
var nType = 1;
var length = \_getUTF8Length(sText);
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) \{
var nLimit = 0;
switch (nCorrectLevel) \{
case QRErrorCorrectLevel.L :
nLimit = QRCodeLimitLength\[i\]\[0\];
break;
case QRErrorCorrectLevel.M :
nLimit = QRCodeLimitLength\[i\]\[1\];
break;
case QRErrorCorrectLevel.Q :
nLimit = QRCodeLimitLength\[i\]\[2\];
break;
case QRErrorCorrectLevel.H :
nLimit = QRCodeLimitLength\[i\]\[3\];
break;
\}
if (length <= nLimit) \{
break;
\} else \{
nType++;
\}
\}
if (nType > QRCodeLimitLength.length) \{
throw new Error("Too long data");
\}
return nType;
\}
function \_getUTF8Length(sText) \{
var replacedText = encodeURI(sText).toString().replace(/\\%\[0-9a-fA-F\]\{2\}/g, 'a');
return replacedText.length + (replacedText.length != sText ? 3 : 0);
\}
/\*\*
\* @class QRCode
\* @constructor
\* @example
\* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
\*
\* @example
\* var oQRCode = new QRCode("test", \{
\* text : "http://naver.com",
\* width : 128,
\* height : 128
\* \});
\*
\* oQRCode.clear(); // Clear the QRCode.
\* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
\*
\* @param \{HTMLElement|String\} el target element or 'id' attribute of element.
\* @param \{Object|String\} vOption
\* @param \{String\} vOption.text QRCode link data
\* @param \{Number\} \[vOption.width=256\]
\* @param \{Number\} \[vOption.height=256\]
\* @param \{String\} \[vOption.colorDark="\#000000"\]
\* @param \{String\} \[vOption.colorLight="\#ffffff"\]
\* @param \{QRCode.CorrectLevel\} \[vOption.correctLevel=QRCode.CorrectLevel.H\] \[L|M|Q|H\]
\*/
QRCode = function (el, vOption) \{
this.\_htOption = \{
width : 256,
height : 256,
typeNumber : 4,
colorDark : "\#000000",
colorLight : "\#ffffff",
correctLevel : QRErrorCorrectLevel.H
\};
if (typeof vOption === 'string') \{
vOption = \{
text : vOption
\};
\}
// Overwrites options
if (vOption) \{
for (var i in vOption) \{
this.\_htOption\[i\] = vOption\[i\];
\}
\}
if (typeof el == "string") \{
el = document.getElementById(el);
\}
this.\_android = \_getAndroid();
this.\_el = el;
this.\_oQRCode = null;
this.\_oDrawing = new Drawing(this.\_el, this.\_htOption);
if (this.\_htOption.text) \{
this.makeCode(this.\_htOption.text);
\}
\};
/\*\*
\* Make the QRCode
\*
\* @param \{String\} sText link data
\*/
QRCode.prototype.makeCode = function (sText) \{
this.\_oQRCode = new QRCodeModel(\_getTypeNumber(sText, this.\_htOption.correctLevel), this.\_htOption.correctLevel);
this.\_oQRCode.addData(sText);
this.\_oQRCode.make();
this.\_el.title = sText;
this.\_oDrawing.draw(this.\_oQRCode);
this.makeImage();
\};
/\*\*
\* Make the Image from Canvas element
\* - It occurs automatically
\* - Android below 3 doesn't support Data-URI spec.
\*
\* @private
\*/
QRCode.prototype.makeImage = function () \{
if (typeof this.\_oDrawing.makeImage == "function" && (!this.\_android || this.\_android >= 3)) \{
this.\_oDrawing.makeImage();
\}
\};
/\*\*
\* Clear the QRCode
\*/
QRCode.prototype.clear = function () \{
this.\_oDrawing.clear();
\};
/\*\*
\* @name QRCode.CorrectLevel
\*/
QRCode.CorrectLevel = QRErrorCorrectLevel;
})();
以上就是qrcode.js,引入成功后在页面上写下如下代码:
<!DOCTYPE html>
还没有评论,来说两句吧...