小程序生成二维码

wxml:

<view>
    <!--显示图片用的标签-->
    <image class="container-4-item-v-ewm" src="{
  {ewmImg}}"></image>
    <!--创建一个画布,将它移出屏幕外看不到的地方-->
    <canvas class="canvas-code" canvas-id="myQrcode"
        style="background:#fff;width: 200px;height: 200px; display:block; left:-800rpx;position:absolute;" />
</view>

js:

	import QRCode from '../../utils/weapp-qrcode.js';
	data: {
        ewmImg:'',
    },
    onLoad(){
      let that = this;
      new QRCode('myQrcode',{
        text: '这里就是放你要扫描出来的内容了',   
        width: 141,	//canvas 画布的宽
        height: 141,	//canvas 画布的高
        padding: 0, // 生成二维码四周自动留边宽度,不传入默认为0
        correctLevel: QRCode.CorrectLevel.L, // 二维码可辨识度
        callback: (res) => {
          //工具回调数据
          // 接下来就可以直接调用微信小程序的api保存到本地或者将这张二维码直接画在海报上面去,看各自需求
          wx.hideLoading()
          console.log("生成二维码",res)
          //将图片路劲放入data中,显示在wxml的image标签上
          that.setData({
            ewmImg:res.path
          })
        
        }
      })
    },

weapp-qrcode.js:

// Core code comes from https://github.com/davidshimjs/qrcodejs

var QRCode;



(function () {

    /**

         * 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);

    }



    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);

            }

        }

    };





    // QRCodeModel

    function QRCodeModel(typeNumber, errorCorrectLevel) {

        this.typeNumber = typeNumber;

        this.errorCorrectLevel = errorCorrectLevel;

        this.modules = null;

        this.moduleCount = 0;

        this.dataCache = null;

        this.dataList = [];

    }

    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(false, 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); if (this.typeNumber >= 7) { this.setupTypeNumber(test); }

            if (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; if ((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] = true; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值