微信小程序canvas自定義分享二維碼


目標(biāo)

  • 應(yīng)用uni-app框架(或者原生微信小程序同理)
  • 使用 Canvas 繪制自定義的二維碼、文字畫布
  • 將畫布轉(zhuǎn)化成可供 分享保存 的圖片

解決方案

方案1

  1. 定義一個二維碼臨時canvas,如 canvas-id="myCanvas"; 以及 繪制完整海報canvas,如canvas-id="myQrcode"
    <!-- 先繪制二維碼 -->
    <canvas :style="{ width: qrcode_w + 'px', height: qrcode_h + 'px', position: 'absolute', left: 0, bottom: '-' + qrcode_h + 'px' }"
     canvas-id="myCanvas" class="my-canvas"></canvas>

    <!-- 繪制所有內(nèi)容 -->
    <canvas :style="{ width: qrcode_w2 + 'px', height: qrcode_h2 + 'px', position: 'absolute', left: 0, bottom: '-' + qrcode_h2 + 'px'  }"
     canvas-id="myQrcode"></canvas>

  1. 使用封裝過的 weapp.qrcode.min.js 進行生成動態(tài)二維碼叨襟,并在回調(diào)函數(shù) callback 獲取圖片資源的網(wǎng)絡(luò)路徑
import QRCode from '@/utils/weapp.qrcode.min.js';
// 繪制二維碼
drawQrCode() {
    new QRCode('myCanvas', {
        // colorLight: '#ffcc66',
        // colorDark: "#ffcc66",
        width: this.qrcode_w,
        height: this.qrcode_h,
        text: `https://canteen.xiangdaoyun.com/upload/qrcode/promoter/?key=f7cf8ab98e9f41be81a60c76073aca46`,
        padding: this.getPxToRpx(100), // 生成二維碼四周自動留邊寬度,不傳入默認為0
        correctLevel: QRCode.CorrectLevel.L, // 二維碼可辨識度
        callback: (res) => {
            // 接下來就可以直接調(diào)用微信小程序的api保存到本地或者將這張二維碼直接畫在海報上面去,看各自需求
            console.log('二維碼: -> ' + res.path)
            this.drawAll(res.path)
        }
    })
}
  1. 運用微信小程序api CanvasContext.drawImage咒吐,將上述2中的網(wǎng)絡(luò)路徑的圖片資源,繪制圖像到畫布2中:myQrcode
// 繪制完整海報
drawAll(qrcodePath) {

    // canvas創(chuàng)建畫圖
    const ctx = wx.createCanvasContext('myQrcode');
    // 繪制背景圖
    ctx.setFillStyle('#fff')
    ctx.fillRect(0, 0, this.qrcode_w2, this.qrcode_h2)
    // 繪制二維碼
    ctx.drawImage(qrcodePath, 0, 0, this.qrcode_w, this.qrcode_h);
    // 繪制字體属划,顏色恬叹,與位置
    ctx.setFontSize(14)
    ctx.setFillStyle('#474747')
    ctx.setTextAlign('center')
    ctx.fillText('測試文字', this.getPxToRpx(300), this.getPxToRpx(620))
    ctx.fillText(uni.$dateUtil.format(new Date(), 'yyyy-MM-dd HH:mm:ss'), this.getPxToRpx(300), this.getPxToRpx(680))

    // canvasToTempFilePath必須要在draw的回調(diào)中執(zhí)行,否則會生成失敗同眯,官方文檔有說明
    ctx.draw(false, setTimeout(() => {
        uni.canvasToTempFilePath({
            x: 0,
            y: 0,
            width: this.qrcode_w2,
            height: this.qrcode_h2,
            destWidth: this.qrcode_w2 * 2,
            destHeight: this.qrcode_h2 * 2,
            canvasId: 'myQrcode',
            success: (res) => {
                // 繪制成功后绽昼,使用預(yù)覽圖片api,展示二維碼海報
                console.log('生成最終海報: -> ' + res.tempFilePath);
                uni.hideLoading();
                uni.previewImage({
                    current: res.tempFilePath, // 當(dāng)前顯示圖片的http鏈接
                    urls: [res.tempFilePath]
                })
            },
            fail: (err) => {
                console.log(err);
                uni.hideLoading();
                uni.showToast({
                    title: '生成失敗',
                    icon: "none"
                })
            }
        })
    }, 200));
}

方案2(只演示方案1须蜗,可做訓(xùn)練)

  1. 定義一個二維碼臨時canvas硅确,如 canvas-id="myCanvas"; 以及 繪制完整海報canvas明肮,如canvas-id="myQrcode"
  2. 使用 weapp.qrcode.min.js 進行在 畫布1 myCanvas 生成動態(tài)二維碼
  3. 使用 wx.canvasToTempFilePath 菱农,將畫布1 myCanvas 中的二維碼導(dǎo)出來,生成 res.tempFilePath 網(wǎng)絡(luò)路徑的圖片資源
  4. 運用微信小程序api CanvasContext.drawImage柿估,將上述2中的網(wǎng)絡(luò)路徑的圖片資源循未,繪制圖像到畫布2中:myQrcode

提示

  1. canvas可以使用絕對定位設(shè)置到界面之外,控制隱藏顯示(根據(jù)自身需要)
  2. canvas在繪制draw的時候官份,不可以設(shè)置 display: none 的隱藏效果只厘,否則繪制不出(和Echarts圖表類庫同理)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舅巷,隨后出現(xiàn)的幾起案子羔味,更是在濱河造成了極大的恐慌,老刑警劉巖钠右,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赋元,死亡現(xiàn)場離奇詭異,居然都是意外死亡飒房,警方通過查閱死者的電腦和手機搁凸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狠毯,“玉大人护糖,你說我怎么就攤上這事〗浪桑” “怎么了嫡良?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵锰扶,是天一觀的道長。 經(jīng)常有香客問我寝受,道長坷牛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任很澄,我火速辦了婚禮京闰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甩苛。我一直安慰自己蹂楣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布浪藻。 她就那樣靜靜地躺著捐迫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爱葵。 梳的紋絲不亂的頭發(fā)上施戴,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音萌丈,去河邊找鬼赞哗。 笑死,一個胖子當(dāng)著我的面吹牛辆雾,可吹牛的內(nèi)容都是我干的肪笋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼度迂,長吁一口氣:“原來是場噩夢啊……” “哼藤乙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惭墓,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坛梁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腊凶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體划咐,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年钧萍,在試婚紗的時候發(fā)現(xiàn)自己被綠了褐缠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡风瘦,死狀恐怖队魏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情万搔,我是刑警寧澤胡桨,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布俐载,位于F島的核電站,受9級特大地震影響登失,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挖炬,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一揽浙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧意敛,春花似錦馅巷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撩独,卻和暖如春敞曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背综膀。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工澳迫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剧劝。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓橄登,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讥此。 傳聞我的和親對象是個殘疾皇子拢锹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355