uniapp生成二維碼、掃描、分享

一、前端生成二維碼
1、import uQRCode from './uqrcode.js' 引入
2、結(jié)構(gòu)

<template>
    <view class="main_box">
        <canvas canvas-id="qrcode" style="width: 450rpx; height: 450rpx;"></canvas>
    </view>
</template>

3、數(shù)據(jù)

data() {
            return {
                id: '123456'  //用戶id
            }
},

4、生成方法

toJSON() {},  //不加會(huì)報(bào)錯(cuò)
async loadList() {
                await uQRCode.make({
                    canvasId: 'qrcode',
                    componentInstance: this,
                    text: this.id,
                    size: uni.upx2px(450),
                    margin: 20,
                    backgroundColor: '#ffffff', //背景顏色
                    foregroundColor: '#000000',
                    fileType: 'jpg',
                    correctLevel: uQRCode.defaults.correctLevel,
                }).then(res => {
                    console.log(res)
                })
            }

5、掃描方法

            const _this = this;
            uni.scanCode({
                // scanType: ['qrCode'],   掃描的類型
                success(res) {
                    //這里即拿到了掃描出的數(shù)據(jù)
                     _this.code = res.result;
                },
                fail(err) {
                    console.log('掃碼失敗', err);
                },
                complete(end) {
                       console.log('掃碼結(jié)束',end)
                }
            });

二、后端生成,前端繪制圓角矩形卡片
1、結(jié)構(gòu)

<canvas canvas-id="card" :style="{ width: windowWidth + 'px', height: windowHeight + 'px' }"></canvas>

2、數(shù)據(jù)

data() {
        return {
            windowWidth: 0,
            windowHeight: 0,
            url: '',
                        headPortrait:''
        };
    },

3、初始化數(shù)據(jù)

getRange() {
            let { windowWidth, windowHeight } = uni.getSystemInfoSync();
            this.windowHeight = windowHeight;
            this.windowWidth = windowWidth;
        },

4、調(diào)用接口,獲取返回值

//轉(zhuǎn)化圖片
this.base64ToSrc(res.data.result, src => {
        this.initCanvas(src);
                        });
//將base64轉(zhuǎn)化
base64ToSrc: function(base64Data, callback) {
            // base64 轉(zhuǎn)格式圖片
            base64ToPath('data:image/png;base64,' + base64Data)
                .then(path => {
                    callback(path);
                })
                .catch(error => {
                    console.error(error);
                });
        },

5、

let ctx = uni.createCanvasContext('card')
            // 繪畫(huà)圖片
                let sp_left = this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(66));
                
                let x = 0,
                 y = 0,
                 w = this.windowWidth,
                 h = this.windowHeight,
                 r = 10
                ctx.beginPath()
                // 因?yàn)檫吘壝柽叴嬖阡忼X,最好指定使用 transparent 填充
                ctx.setFillStyle('transparent')
                ctx.setStrokeStyle('transparent')
                // 左上角
                ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5)
                ctx.setFillStyle('#3F72F1');
                    ctx.fill();
                            
                // border-top
                ctx.moveTo(x + r, y)
                ctx.lineTo(x + w - r, y)
                ctx.lineTo(x + w, y + r)
                // 右上角
                ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2)
                ctx.setFillStyle('#3F72F1');
                    ctx.fill();
                            
                // // border-right
                ctx.lineTo(x + w, y + h - r)
                ctx.lineTo(x + w - r, y + h)
                // // 右下角
                ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5)
                ctx.setFillStyle('#ffffff');
                    ctx.fill();
                            
                // // border-bottom
                ctx.lineTo(x + r, y + h)
                ctx.lineTo(x, y + h - r)
                // // 左下角
                ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI)
                ctx.setFillStyle('#ffffff');
                    ctx.fill();
                // // border-left
                ctx.lineTo(x, y + r)
                ctx.lineTo(x + r, y)
                            
                // 這里是使用 fill 還是 stroke都可以,二選一即可,但是需要與上面對(duì)應(yīng)
                // ctx.fill()
                // ctx.stroke()
                ctx.closePath()
                // 剪切
                ctx.clip()
                ctx.restore()
                // ctx.setFillStyle('#ffffff');
                // ctx.strokeStyle = "#ffffff"
                ctx.fillStyle = "#ffffff";
                ctx.fill();
                ctx.fillRect(
                 this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(337)),
                 this.computedPoorWidth(25),
                 this.computedPoorWidth(337),
                 this.computedPoorWidth(500)
                );
                let path = 'https://dev.gchshi.com/patient/images/reproduction/share_head.png'
                ctx.drawImage(path, 0, this.computedPoorWidth(0), this.windowWidth, this.computedPoorWidth(100));
            
                ctx.drawImage(this.headPortrait, sp_left, this.computedPoorWidth(50), this.computedPoorWidth(66), this.computedPoorWidth(66));
                // 頭像

                // 二維碼
                sp_left = this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(100));
                ctx.drawImage(this.url, sp_left, this.computedPoorWidth(205), this.computedPoorWidth(100), this.computedPoorWidth(110));

                sp_left = this.computedSpaceBetween(this.windowWidth, this.computedPoorWidth(200));

                ctx.setFontSize(18);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('black');
                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                ctx.fillText('名字', sp_left, this.computedPoorWidth(140));
                ctx.setFontSize(12);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('#666666');
                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                ctx.fillText('標(biāo)題一', sp_left, this.computedPoorWidth(170));
                sp_left = this.computedSpaceBetween(this.windowWidth, 35);

                ctx.stroke();
                ctx.setFontSize(18);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('black');
                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                // ctx.fillText('標(biāo)題二', sp_left, this.computedPoorWidth(210));

                ctx.setFontSize(14);
                ctx.setTextAlign('center');
                ctx.setTextBaseline('top');
                ctx.setFillStyle('#999999');

                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                // ctx.fillText('標(biāo)題三', sp_left, this.computedPoorWidth(240));

                // ctx.setFontSize(12);
                // ctx.setTextAlign('center');
                // ctx.setTextBaseline('top');
                // ctx.setFillStyle('#525157');

                sp_left = this.computedSpaceBetween(this.windowWidth, 0);
                ctx.fillText('標(biāo)題四', sp_left, this.computedPoorWidth(345));
                // ctx.fillText('標(biāo)題五', sp_left, this.computedPoorWidth(405));
                ctx.draw();

三、保存圖片,分享朋友,分享朋友圈
1、保存圖片

        // 保存圖片
        saveImage: function() {
            uni.showLoading({ title: '正在生成圖片...' });
            uni.canvasToTempFilePath({
                x: 0,
                y: 0,
                width: this.windowWidth,
                height: this.windowHeight,
                canvasId: 'card',
                success: res => {
                    uni.saveImageToPhotosAlbum({
                        filePath: res.tempFilePath,
                        success: data => {
                            showToast({
                                title: '已保存至手機(jī)相冊(cè)',
                                icon: 'none'
                            });
                            uni.hideLoading();
                        },
                        fail: err => {
                            console.log(err);
                        },
                        complete: () => {
                            uni.hideLoading();
                        }
                    });
                }
            });
        },

2、分享朋友

        // 分享到微信好友
        shareWeixin() {
            uni.showLoading({
                title: '努力加載中'
            });
            uni.share({
                provider: 'weixin',
                scene: 'WXSceneSession',
                type: 5,
                imageUrl: '',//png地址
                title: '',
                miniProgram: {
                    id: '',
                    path: '',
                    type: 0,
                    webUrl: ''
                },
                success: ret => {
                    showToast({
                        title: '分享成功',
                        icon: 'none'
                    });
                    uni.hideLoading();
                }
            });
        },
        

3、分享到朋友圈

        // 分享到微信朋友圈
        shareTimeline() {
            uni.showLoading({ title: '正在生成圖片...' });
            uni.canvasToTempFilePath({
                x: 0,
                y: 0,
                width: this.windowWidth,
                height: this.windowHeight,
                canvasId: 'card',
                success: res => {
                    uni.saveImageToPhotosAlbum({
                        filePath: res.tempFilePath,
                        success: data => {
                            uni.share({
                                provider: 'weixin',
                                scene: 'WXSenceTimeline',
                                type: 2,
                                imageUrl: res.tempFilePath,
                                success: function(res) {
                                    showToast({
                                        title: '分享成功',
                                        icon: 'none'
                                    });
                                    uni.hideLoading();
                                },
                                fail: function(err) {
                                    console.log(err);
                                }
                            });
                        },
                        fail: err => {
                            console.log(err);
                        },
                        complete: () => {
                            uni.hideLoading();
                        }
                    });
                }
            });
        }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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