首頁 > 軟體

教你用wxml2canvas將微信小程式頁面轉為圖片

2022-11-27 14:00:45

最近有個微信小程式專案,需要將頁面轉為圖片。微信小程式提供的Api是wx.canvasToTempFilePath,這個方法是將畫布指定區域的內容匯出生成指定大小的圖片,但是我們是將頁面匯出圖片,所以可以使用wxml2canvas解決

1、安裝wxml2canvas

npm init
npm install wxml2canvas --save --production

npm init 是npm初始化,這個時候根據編譯器終端一路回車最終會生成一個package.json檔案

--production 是減少安裝與業務無關的包,減少專案的體積。

2、引入wxml2canvas

import Wxml2Canvas from 'wxml2canvas'

引入之後需要對微信開發者工具做出如下設定,否則引入之後會報錯

 其次選擇微信開發者工具--》工具---》構建npm

這個時候就不會報錯了

3、使用wxml2canvas

首先在需要生成圖片的wxml檔案中建立canvas容器以及選擇生成圖片的範圍

<canvas canvas-id="myCanvas" class="myCanvas"></canvas>
<view id="my-canvas" class="my_canvas>
    <view class="header my_draw_canvas">
        <image class="headerImg my_draw_canvas" src="{{order.headerImg}}" data-type="image" data-url="{{order.headerImg}}"></image>
        <text class="headerTitle my_draw_canvas" data-type="text" data-text="您的訂單詳情">您的訂單詳情</text>
    </view>
</view>

每個需要生成圖片的內容,需要註明型別。

text標籤對應的data-type='text',image標籤對應的data-type=‘image’

data-text=‘需要展示的文字’  data-url='需要展示的圖片'

其他的data-type型別可以參考https://github.com/liudongyun1215/wxml2canvas

這個連結裡面包含了許多設定項,就不一一列舉了,遇到問題的時候可以參考這個檔案

js檔案的方法

drawMyCanvas() {
        wx.showLoading()
        const that = this
        const query = wx.createSelectorQuery().in(this);
        query.select('#my-canvas').fields({ // 選擇需要生成canvas的範圍
            size: true,
            scrollOffset: true
        }, data => {
            let width = data.width;
            let height = data.height;
            that.setData({
                width,
                height
            })
            setTimeout(() => {
                that.startDraw()
            }, 1500);
       }).exec()
},
startDraw() {
        let that = this
        
        // 建立wxml2canvas物件
        let drawMyImage = new Wxml2Canvas({
          element: 'myCanvas', // canvas的id,
          obj: that, // 傳入當前元件的this
          width: that.data.width * 2,
          height: that.data.height * 2,
          background: '#141415', // 生成圖片的背景色
          progress(percent) { // 進度
            // console.log(percent);
          },
          finish(url) { // 生成的圖片
            wx.hideLoading()
            that.savePoster(url)
          },
          error(res) { // 失敗原因
            console.log(res);
            wx.hideLoading()
          }
        }, this);
        let data = {
            // 獲取wxml資料
            list: [{
                type: 'wxml',
                class: '.my_canvas .my_draw_canvas',  // my_canvas要繪製的wxml元素根類名, my_draw_canvas單個元素的類名(所有要繪製的單個元素都要新增該類名)
                limit: '.my_canvas', // 要繪製的wxml元素根類名
                x: 0,
                y: 0
            }]
        }
        // 繪製canvas
        drawMyImage.draw(data, this);
    },
savePoster() {
        const that = this
        wx.saveImageToPhotosAlbum({
            filePath: that.data.imgUrl,
            success: function() {
                wx.showToast({
                    title: '儲存成功',
                    icon: 'none',
                    duration: 1500
                });
            },
            fail(err) {
              if (err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" || err.errMsg === "saveImageToPhotosAlbum:fail auth deny" || err.errMsg === "saveImageToPhotosAlbum:fail authorize no response") {
                wx.showModal({
                  title: '提示',
                  content: '需要您授權儲存相簿',
                  showCancel: false,
                  success: modalSuccess => {
                    wx.openSetting({
                      success(settingdata) {
                        if (settingdata.authSetting['scope.writePhotosAlbum']) {
                            wx.saveImageToPhotosAlbum({
                                filePath: that.data.imgUrl,
                                success: function () {
                                  wx.showToast({
                                    title: '儲存成功',
                                    icon: 'success',
                                    duration: 2000
                                  })
                                },
                            })
                        } else {
                            wx.showToast({
                                title: '授權失敗,請稍後重新獲取',
                                icon: 'none',
                                duration: 1500
                            });
                        }
                      }
                    })
                  }
                })
              }
            }
          })
      },

4、注意

使用wxml儲存圖片的時候,如果包含線上的圖片連結,需要在微信小程式後臺設定白名單,將線上連結的域名放置downloadFile合法域名裡,否則生成圖片的時候會報錯

還有就是頁面上的標籤需要有寬度,否則模擬器匯出正常,真機匯出樣式就會亂

總結

到此這篇關於用wxml2canvas將微信小程式頁面轉為圖片的文章就介紹到這了,更多相關微信小程式頁面轉為圖片內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com