教你用wxml2canvas將微信小程序頁面轉(zhuǎn)為圖片
最近有個微信小程序項目,需要將頁面轉(zhuǎn)為圖片。微信小程序提供的Api是wx.canvasToTempFilePath,這個方法是將畫布指定區(qū)域的內(nèi)容導(dǎo)出生成指定大小的圖片,但是我們是將頁面導(dǎo)出圖片,所以可以使用wxml2canvas解決
1、安裝wxml2canvas
npm init npm install wxml2canvas --save --production
npm init 是npm初始化,這個時候根據(jù)編譯器終端一路回車最終會生成一個package.json文件
--production 是減少安裝與業(yè)務(wù)無關(guān)的包,減少項目的體積。
2、引入wxml2canvas
import Wxml2Canvas from 'wxml2canvas'
引入之后需要對微信開發(fā)者工具做出如下設(shè)置,否則引入之后會報錯

其次選擇微信開發(fā)者工具--》工具---》構(gòu)建npm
這個時候就不會報錯了
3、使用wxml2canvas
首先在需要生成圖片的wxml文件中創(chuàng)建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>每個需要生成圖片的內(nèi)容,需要注明類型。
text標(biāo)簽對應(yīng)的data-type='text',image標(biāo)簽對應(yīng)的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
// 創(chuàng)建wxml2canvas對象
let drawMyImage = new Wxml2Canvas({
element: 'myCanvas', // canvas的id,
obj: that, // 傳入當(dāng)前組件的this
width: that.data.width * 2,
height: that.data.height * 2,
background: '#141415', // 生成圖片的背景色
progress(percent) { // 進(jìn)度
// console.log(percent);
},
finish(url) { // 生成的圖片
wx.hideLoading()
that.savePoster(url)
},
error(res) { // 失敗原因
console.log(res);
wx.hideLoading()
}
}, this);
let data = {
// 獲取wxml數(shù)據(jù)
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: '需要您授權(quán)保存相冊',
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: '授權(quán)失敗,請稍后重新獲取',
icon: 'none',
duration: 1500
});
}
}
})
}
})
}
}
})
},4、注意
使用wxml保存圖片的時候,如果包含在線的圖片鏈接,需要在微信小程序后臺設(shè)置白名單,將在線鏈接的域名放置downloadFile合法域名里,否則生成圖片的時候會報錯

還有就是頁面上的標(biāo)簽需要有寬度,否則模擬器導(dǎo)出正常,真機(jī)導(dǎo)出樣式就會亂
總結(jié)
到此這篇關(guān)于用wxml2canvas將微信小程序頁面轉(zhuǎn)為圖片的文章就介紹到這了,更多相關(guān)微信小程序頁面轉(zhuǎn)為圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript中的altKey 和 Event屬性大全
本文給大家介紹javascript中的altkey和event屬性大全,涉及到altkey和event屬性語法定義及用法,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧2015-11-11
詳解JavaScript運(yùn)算符中==和===的區(qū)別
在JavaScript中==運(yùn)算符和===運(yùn)算符是經(jīng)常遇到的,那么二者有哪些區(qū)別呢,本文就來和大家進(jìn)行簡單的討論,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)2023-05-05
layui實現(xiàn)數(shù)據(jù)表格自定義數(shù)據(jù)項
今天小編就為大家分享一篇layui實現(xiàn)數(shù)據(jù)表格自定義數(shù)據(jù)項,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10

