教你用wxml2canvas將微信小程序頁(yè)面轉(zhuǎn)為圖片
最近有個(gè)微信小程序項(xiàng)目,需要將頁(yè)面轉(zhuǎn)為圖片。微信小程序提供的Api是wx.canvasToTempFilePath,這個(gè)方法是將畫布指定區(qū)域的內(nèi)容導(dǎo)出生成指定大小的圖片,但是我們是將頁(yè)面導(dǎo)出圖片,所以可以使用wxml2canvas解決
1、安裝wxml2canvas
npm init npm install wxml2canvas --save --production
npm init 是npm初始化,這個(gè)時(shí)候根據(jù)編譯器終端一路回車最終會(huì)生成一個(gè)package.json文件
--production 是減少安裝與業(yè)務(wù)無(wú)關(guān)的包,減少項(xiàng)目的體積。
2、引入wxml2canvas
import Wxml2Canvas from 'wxml2canvas'
引入之后需要對(duì)微信開(kāi)發(fā)者工具做出如下設(shè)置,否則引入之后會(huì)報(bào)錯(cuò)
其次選擇微信開(kāi)發(fā)者工具--》工具---》構(gòu)建npm
這個(gè)時(shí)候就不會(huì)報(bào)錯(cuò)了
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>
每個(gè)需要生成圖片的內(nèi)容,需要注明類型。
text標(biāo)簽對(duì)應(yīng)的data-type='text',image標(biāo)簽對(duì)應(yīng)的data-type=‘image’
data-text=‘需要展示的文本’ data-url='需要展示的圖片'
其他的data-type類型可以參考https://github.com/liudongyun1215/wxml2canvas
這個(gè)鏈接里面包含了許多配置項(xiàng),就不一一列舉了,遇到問(wèn)題的時(shí)候可以參考這個(gè)文檔
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對(duì)象 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單個(gè)元素的類名(所有要繪制的單個(gè)元素都要添加該類名) 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)保存相冊(cè)', 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)失敗,請(qǐng)稍后重新獲取', icon: 'none', duration: 1500 }); } } }) } }) } } }) },
4、注意
使用wxml保存圖片的時(shí)候,如果包含在線的圖片鏈接,需要在微信小程序后臺(tái)設(shè)置白名單,將在線鏈接的域名放置downloadFile合法域名里,否則生成圖片的時(shí)候會(huì)報(bào)錯(cuò)
還有就是頁(yè)面上的標(biāo)簽需要有寬度,否則模擬器導(dǎo)出正常,真機(jī)導(dǎo)出樣式就會(huì)亂
總結(jié)
到此這篇關(guān)于用wxml2canvas將微信小程序頁(yè)面轉(zhuǎn)為圖片的文章就介紹到這了,更多相關(guān)微信小程序頁(yè)面轉(zhuǎn)為圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實(shí)現(xiàn)顯示當(dāng)前日期的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了js實(shí)現(xiàn)顯示當(dāng)前日期功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07javascript中的altKey 和 Event屬性大全
本文給大家介紹javascript中的altkey和event屬性大全,涉及到altkey和event屬性語(yǔ)法定義及用法,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧2015-11-11js事件監(jiān)聽(tīng)器用法實(shí)例詳解
這篇文章主要介紹了js事件監(jiān)聽(tīng)器用法,以實(shí)例形式較為詳細(xì)的分析了javascript事件監(jiān)聽(tīng)器使用注意事項(xiàng)與相關(guān)技巧,需要的朋友可以參考下2015-06-06詳解JavaScript運(yùn)算符中==和===的區(qū)別
在JavaScript中==運(yùn)算符和===運(yùn)算符是經(jīng)常遇到的,那么二者有哪些區(qū)別呢,本文就來(lái)和大家進(jìn)行簡(jiǎn)單的討論,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)2023-05-05layui實(shí)現(xiàn)數(shù)據(jù)表格自定義數(shù)據(jù)項(xiàng)
今天小編就為大家分享一篇layui實(shí)現(xiàn)數(shù)據(jù)表格自定義數(shù)據(jù)項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10JavaScript數(shù)組去重的幾種方法效率測(cè)試
JavaScript數(shù)組去重是前端面試酷愛(ài)的問(wèn)題,問(wèn)題簡(jiǎn)單而又能看出程序員對(duì)計(jì)算機(jī)程序執(zhí)行過(guò)程的理解如何。數(shù)組去重的方法有很多,到底哪種是最理想的我不清楚。于是我測(cè)試了下數(shù)組去重的效率。測(cè)試二十萬(wàn)個(gè)數(shù)據(jù),隨著數(shù)據(jù)越多效率很明顯的就體驗(yàn)了出來(lái)。下面來(lái)一起看看吧。2016-10-10