微信小程序:wxml-to-canvas 使用记录

原因:界面上有保存图片、在微信端分享的需求,以前有类似功能,前端实现页面模板,通过后端使用PhantomJS 无界面的浏览器组件渲染后进行截图实现,但生成过程较慢,经商议本次通过前端实现保存图片功能

目的:通过把页面用canvas绘制,从而导出为图片保存在手机。

介绍:不同于h5有许多调用简单、可以截取页面的成熟插件,在微信小程序上绘制canvas 除了使用原生canvas外,官方提供了wxml-to-canvas组件。尽管并不完善,但相比直接canvas绘制,方便了序多,另外还有Painter (第三方组件)也类似。

问题:组件渲染支持view、image、text 标签。默认flex布局,引入的图片地址需要是https 开头的网络图片地址,所有文字内容要用text标签包裹、并且需要指定宽高,文字不会自动换行,超出部分会截断。所以相较于静态页面,对于动态获取数据的页面,需要计算宽高及位置

1、组件在真机上不展示,提示canvas has not been created。
解决方法:npm构建后发现 ,miniprogram_npm/wxml-to-canvas/index.js 文件内,sdk版本在2.9.2 后可用canvas 2d 接口,

 真机上版本较低,于是注释并设置值为false,在真机上展示出来了

2、计算所有元素宽高位置

解决:由于页面内容大部分动态获取、宽高不定,全部计算工作量很大,用了比较笨的方法,先布局出一模一样的wxml页面,渲染后,通过

query = wx.createSelectorQuery().in(this)

query.select('.demo').boundingClientRect(res=>{}).exec()

获取每个元素的宽高位置后赋值实现,与此同时,文字的行距、字号大小无法获取,需要根据设计图和页面比例另外计算,注意:Dpr为2和3时的字号大小有区别

3、不支持字体加粗

解决方法:同上,在index.js文件内,修改代码实现。但是注意,在使用fontWeight:"bold"后的文字都变成加粗,网上有人推荐加粗写在最后,可避免影响其他的样式,试过后依然会影响。
结果:放弃使用加粗

 

4、图片变形:绘制出的image,无法等比显示,图片要么压缩,要么被拉伸,效果较差,

结果:未解决

5、渲染:canvas需要在页面资源加载完成后再创建渲染,否则会失败。

问题: 保存为图片的时间非常久

结果:后来经查询,设置图中两个属性后,保存图片速度提升很多。

结果:由于图片内容和尺寸关系,保存时间最终在3-5秒之间

综合结论:

虽然保存长图最终在3-5秒之间,比后台截图快了一些,但不如预期。

考虑到投入工作量、解决兼容性问题消耗的时间和最终保存图片的效果来看,对于宽高动态计算的页面,推荐前端实现模板,后台截图实现保存效果更好。

对于在微信小程序上的同类型保存功能,前端比较适合实现简单布局的页面图片保存。

引用\[2\]: 二、官方示例使用方法 1.安装wxml-to-canvas npm install --save wxml-to-canvas 2.JSON 组件声明 { "usingComponents": { "wxml-to-canvas": "wxml-to-canvas", } } 3.wxml 引入组件 <video class="video" src="{{src}}"> <wxml-to-canvas class="widget"></wxml-to-canvas> </video> <image src="{{src}}" style="width: {{width}}px; height: {{height}}px"></image> 4.js 获取实例 const {wxml, style} = require('./demo.js') Page({ data: { src: '' }, onLoad() { this.widget = this.selectComponent('.widget') }, renderToCanvas() { const p1 = this.widget.renderToCanvas({ wxml, style }) p1.then((res) => { this.container = res this.extraImage() }) }, extraImage() { const p2 = this.widget.canvasToTempFilePath() p2.then(res => { this.setData({ src: res.tempFilePath, width: this.container.layoutBox.width, height: this.container.layoutBox.height }) }) } }) 问题:\["usingComponents"\]\["wxml-to-canvas"\]: "wxml-to-canvas" 未找到 回答: 根据提供的代码,\["usingComponents"\]\["wxml-to-canvas"\]: "wxml-to-canvas" 未找到的错误通常是由于未正确引入组件导致的。在JSON文件中,需要将"wxml-to-canvas"添加到"usingComponents"字段中,确保路径和组件名正确。在wxml文件中,使用<wxml-to-canvas>标签来引入组件。在js文件中,使用this.selectComponent('.widget')来获取组件实例。请检查您的代码,确保正确引入了"wxml-to-canvas"组件。 #### 引用[.reference_title] - *1* *3* [微信小程序使用wxml-to-canvas](https://blog.csdn.net/m0_49440146/article/details/126997331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [微信小程序插件--wxml-to-canvas(生成图片)](https://blog.csdn.net/animatecat/article/details/125981963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值